簡體   English   中英

如何觀察取消令牌?

[英]How to observe cancellation token?

除了在循環中檢查取消令牌,還有其他方法可以觀察取消令牌嗎?

while (moreToDo)
{
    // Poll on this property if you have to do
    // other cleanup before throwing.
    if (cancellationToken.IsCancellationRequested)
    {
        // Clean up here, then...
        cancellationToken.ThrowIfCancellationRequested();
     }

}

示例來自: https : //docs.microsoft.com/zh-cn/dotnet/standard/parallel-programming/task-cancellation

當方法運行超過5秒時,我想取消任務。 但是處理VeryLong方法可能需要5秒鍾以上。

var cancelationTokenSource = new CancellationTokenSource(5000);
Task.Factory.StartNew(
     () =>
     {
         VeryLongMethod();

      }, cancelationTokenSource.Token
);

有人建議我嘗試注冊回調,但是在超時后,仍然執行了很長的方法。

var cancellationTokenSource = new CancellationTokenSource(20000);

        await Task.Factory.StartNew
        (
            () =>
            {
                using (cancellationTokenSource.Token.Register(() =>
                {

                    Program.Console.WriteToConsole("Failed on timeout.");


                    try
                    {
                        cancellationTokenSource.Token.ThrowIfCancellationRequested();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Action was processed already");                            
                    }

                }))
                {
                    VeryLongMethod();
                }
            }, cancellationTokenSource.Token
        );

您可以注冊一個回調,當令牌被取消時將被調用:

using(var reg = cancellationToken.Register(() => { /* cancellation logic */ }))
{
    // your code
}

更新:對於您更新的問題,您可以告訴取消令牌來源,它必須在一段時間后取消其令牌,如下所示:

cancelationTokenSource.CancelAfter(TimeSpan.FromSeconds(5));

簡而言之,沒有。 定期池化是我們檢查任務是否打算取消的唯一方法。 CancellationToken不提供任何其他通知方式來檢查它, IsCancellationRequestedThrowIfCancellationRequested是我們知道必須取消的唯一方法。

這意味着在當前基於異步等待任務的設計中,可取消方法必須定期檢查自身,以了解調用者是否要取消並自行提供退出點。 現在沒有直接取消方法的方法,而無需將其更改為與取消系統“合作”。

它本身不需要循環,但是無論如何,檢查都需要某種形式的池化。 循環是典型的構造,但是可以使用其他任何東西。

暫無
暫無

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

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