簡體   English   中英

如何在不阻止GUI的情況下等待多個任務?

[英]How to wait for multiple Tasks without blocking the GUI?

在C#.NET 4.0 Windows Forms GUI應用程序中,響應單擊一個按鈕,我需要產生大量進程並將它們顯示在列表框中。 當每個進程結束時,應將其從列表中刪除,完成所有進程后,應該會發生某些情況。

從4.0開始,我認為使用Task是最好的方法,但是我不能只運行一堆任務並調用Task.WaitAll因為那樣會阻塞主UI線程,因為按鈕單擊處理程序不會返回。

實現此目的的最佳方法是什么? 我可以看到兩個主要選項:

  1. 按鈕處理程序將啟動一個任務,該任務將運行所有其他任務,並等待它們完成。
  2. 我不使用Task.WaitAll每個任務完成時,它都會檢查(或告訴應用程序進行檢查)所有任務是否都已完成。

但是這里有使用TPL的標准/首選解決方案嗎?

此外-可以在Task更新我的形式GUI或者我需要去耦任務的GUI交互,例如當Task完成它激發了一個事件Form

偽代碼很棒-我是TPL的新手,並且.NET 4.0中提供了許多有趣的東西。

如果使用的是.NET 4.5,則應使用await Task.WhenAll(...) 它可以處理IEnumerable<Task>Task[]以及IEnumerable<Task<TResult>>

如果沒有方法可以使用.NET 4.5,則可以自己提出一個解決方案,其中涉及Task.ContinueWith和一個剩余要運行的任務的計數器,該計數器使用Interlocked.Decrement更新。 另外,您可以通過查看此源來查看在.NET 4.5中的完成方式。 http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Task.cs,69351c6da968e5d1 這有點冗長,但基本上就是我所說的:任務與其他一些更新內部計數器的任務一起繼續。

暫無
暫無

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

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