簡體   English   中英

System.Threading.Tasks不服從開始規則?

[英]System.Threading.Tasks not obeying start rules?

重寫:我已經刪除了問題以包含示例代碼而不是鏈接到它以及結果和問題,因為周圍的信息似乎導致混淆。

問題:為什么任務似乎從一開始就沒有開始?

這是Microsoft網站上有關任務的示例代碼。 它被描述為創建一個未啟動的任務,創建第二個啟動的任務並等待它完成,然后啟動第一個任務,最后在主線程中同步啟動第三個任務。

以下是示例代碼的未注釋版本:

using System;
using System.Threading;
using System.Threading.Tasks;

class StartNewDemo
{
    static void Main()
    {
        Action<object> action = (object obj) =>
        {
            Console.WriteLine("Task={0}, obj={1}, Thread={2}", Task.CurrentId, obj.ToString(), Thread.CurrentThread.ManagedThreadId);
        };

        Task t1 = new Task(action, "alpha");

        Task t2 = Task.Factory.StartNew(action, "beta");

        t2.Wait();

        t1.Start();

        Console.WriteLine("t1 has been launched. (Main Thread={0})", Thread.CurrentThread.ManagedThreadId);

        t1.Wait();

        Task t3 = new Task(action, "gamma");

        t3.RunSynchronously();

        t3.Wait();
    }
}

結果如下:

Task=1, obj=beta, Thread=3
t1 has been launched. (Main Thread=1)
Task=2, obj=alpha, Thread=3
Task=3, obj=gamma, Thread=1

從描述任務1(Beta)開始,只有在任務2完成后才能運行,因此主線程可以進行。 這個輸出似乎不是這種情況。 我還運行了第二次測試運行,其中我將滴答計數的顯示放入操作對象並收到此信息,確認Task1確實在Task2完成之前啟動。

Task=1, obj=beta, Thread=3 (634529151744201906)
t1 has been launched. (Main Thread=1)
Task=2, obj=alpha, Thread=3 (634529151744221908)
Task=3, obj=gamma, Thread=1 (634529151744221908)

我不想在這里做任何想象,我只是在尋找一個解釋,為什么在給出指令之前,Task1(obj = beta)顯然正在執行。

Task=1, obj=beta, Thread=3

Task = 1在這里有點誤導,因為這在示例代碼中實際上是t2。 你可以看到這個,因為'beta'存在。 它在運行t1之前啟動並完成。

t1 has been launched. (Main Thread=1)
Task=2, obj=alpha, Thread=3

這是t1(Id 2)。

Task=3, obj=gamma, Thread=1

這是t3。

在沒有某種形式的同步的情況下,不保證線程或將Task分配給線程(即,非確定性)。

當您啟動任務時,它可能不會立即執行(如果沒有可用的線程池線程)。 但任務永遠不會自己開始。 你觀察到的輸出是正確的。

代碼執行如下:

  • t1alpha )已創建,但未執行
  • 創建,啟動t2beta ),打印到控制台(顯然使用TaskId == 1 )並等待
  • 啟動t1alpha ),顯然是使用TaskId == 2
  • 打印有關開始t1通知
  • t1alpha )打印到控制台並等待
  • 其余應該是顯而易見的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM