[英]Cancel task and wait for it to finish
我有一個耗時的任務,我需要在一個單獨的線程中運行,以避免鎖定GUI線程。 隨着此任務的進行,它會更新特定的GUI控件。
問題是用戶可能在任務結束之前移動到GUI的另一部分,在這種情況下,我必須:
舉一個具體的例子,假設表單有兩個部分:一個用於導航目錄樹,另一個用於顯示縮略圖。 當用戶導航到另一個目錄時,需要刷新縮略圖。
首先我想到使用BackgroundWorker
和AutoResetEvent
等待取消,但我必須弄亂一些東西,因為我在取消時遇到了死鎖。 然后我讀到了關於TPL,它應該取代BGW和更原始的機制。
使用TPL可以輕松完成嗎?
有幾點需要注意:
你可以得到CancellationToken
從CancellationTokenSource
任務取消是一種合作行為:如果您的任務沒有定期檢查CancellationToken.IsCancellationRequested
屬性,那么嘗試取消任務的次數並不重要,它會隨意地流失。
那些事情說,這是一般的想法:
void Main()
{
var tokenSource = new CancellationTokenSource();
var myTask = Task.Factory
.StartNew(() => DoWork(tokenSource.Token), tokenSource.Token);
Thread.Sleep(1000);
// ok, let's cancel it (well, let's "request it be cancelled")
tokenSource.Cancel();
// wait for the task to "finish"
myTask.Wait();
}
public void DoWork(CancellationToken token)
{
while(!token.IsCancellationRequested)
{
// Do useful stuff here
Console.WriteLine("Working!");
Thread.Sleep(100);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.