雖然試圖找出新的(可能不是現在這麼新,但對我來說是新手)Task
在C#中的異步編程,我遇到了一個問題,讓我花了一些時間弄清楚,我不知道爲什麼。Task.WaitAll不等待任務完成
我已經解決了這個問題,但我仍然不確定爲什麼它是一個問題開始。我只是想我會分享我的經驗,以防萬一有人遇到同樣的情況。
如果任何大師想告訴我問題的原因,這將是美好的,非常感激。我總是喜歡只知道爲什麼東西不起作用!
我做了一個測試任務,如下所示:
Random rng = new Random((int)DateTime.UtcNow.Ticks);
int delay = rng.Next(1500, 15000);
Task<Task<object>> testTask = Task.Factory.StartNew<Task<object>>(
async (obj) =>
{
DateTime startTime = DateTime.Now;
Console.WriteLine("{0} - Starting test task with delay of {1}ms.", DateTime.Now.ToString("h:mm:ss.ffff"), (int)obj);
await Task.Delay((int)obj);
Console.WriteLine("{0} - Test task finished after {1}ms.", DateTime.Now.ToString("h:mm:ss.ffff"), (DateTime.Now - startTime).TotalMilliseconds);
return obj;
},
delay
);
Task<Task<object>>[] tasks = new Task<Task<object>>[] { testTask };
Task.WaitAll(tasks);
Console.WriteLine("{0} - Finished waiting.", DateTime.Now.ToString("h:mm:ss.ffff"));
// make console stay open till user presses enter
Console.ReadLine();
然後我跑的應用程序,看看它吐出來。以下是一些示例輸出:
6:06:15.5661 - 延遲3053ms開始測試任務。
6:06:15.5662 - 已完成等待。
6:06:18.5743 - 3063.235ms後完成測試任務。
正如你所看到的,Task.WaitAll(tasks);
聲明並沒有太多的作用。在繼續執行之前,它總共等待1毫秒。
我已經在下面回答了我自己的「問題」 - 但正如我上面所說的 - 如果有人比我更懂得解釋爲什麼這不起作用,請做! (I 認爲它可能與該方法的執行「跳出」有關,一旦它達到了await
操作員 - 然後一旦等待完成後又退回......但我可能是錯的)
爲什麼要那樣做'新的隨機((int)的DateTime.UtcNow.Ticks)'?爲什麼不只是'新的Random()',因爲它實際上是同一件事情。 – Enigmativity
不是說這個問題對於這個問題是重要的或者相關的,而是純粹爲了看看它做了什麼,如果有的話。我沒有注意到與調用無參數構造函數有什麼不同,所以我從現在開始就這樣做。 如果你不嘗試新的東西,你不會學到任何東西。編程對我來說是一種愛好,除了Karel Robot,Pascal和SQL之外,我還沒有接受過任何正式的教育,而這已經是13年以前的事了,所以對我來說修改,嘗試,破壞事物,圖他們出去學習。 – cjk84
你最好下載一個免費的.NET反編譯器並查看源代碼。 – Enigmativity