[英]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
分配給線程(即,非確定性)。
當您啟動任務時,它可能不會立即執行(如果沒有可用的線程池線程)。 但任務永遠不會自己開始。 你觀察到的輸出是正確的。
代碼執行如下:
t1
( alpha
)已創建,但未執行 t2
( beta
),打印到控制台(顯然使用TaskId == 1
)並等待 t1
( alpha
),顯然是使用TaskId == 2
t1
通知 t1
( alpha
)打印到控制台並等待
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.