簡體   English   中英

取消任務並等待它完成

[英]Cancel task and wait for it to finish

我有一個耗時的任務,我需要在一個單獨的線程中運行,以避免鎖定GUI線程。 隨着此任務的進行,它會更新特定的GUI控件。

問題是用戶可能在任務結束之前移動到GUI的另一部分,在這種情況下,我必須:

  1. 取消正在進行的任務(如果它處於活動狀態)
  2. 等到它完成取消:這是至關重要的,因為耗時任務的目標是更新特定控件。 如果多個線程同時嘗試執行此操作,事情可能會變得混亂。
  3. 從頭開始執行任務

舉一個具體的例子,假設表單有兩個部分:一個用於導航目錄樹,另一個用於顯示縮略圖。 當用戶導航到另一個目錄時,需要刷新縮略圖。

首先我想到使用BackgroundWorkerAutoResetEvent等待取消,但我必須弄亂一些東西,因為我在取消時遇到了死鎖。 然后我讀到了關於TPL,它應該取代BGW和更原始的機制。

使用TPL可以輕松完成嗎?

有幾點需要注意:

  • 你可以得到CancellationTokenCancellationTokenSource

  • 任務取消是一種合作行為:如果您的任務沒有定期檢查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.

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