[英]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
不提供任何其他通知方式來檢查它, IsCancellationRequested
和ThrowIfCancellationRequested
是我們知道必須取消的唯一方法。
這意味着在當前基於異步等待任務的設計中,可取消方法必須定期檢查自身,以了解調用者是否要取消並自行提供退出點。 現在沒有直接取消方法的方法,而無需將其更改為與取消系統“合作”。
它本身不需要循環,但是無論如何,檢查都需要某種形式的池化。 循環是典型的構造,但是可以使用其他任何東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.