CancellationToken
的IsCancellationRequested
属性有什么用?考虑下面的代码
static void Main(string[] args)
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Console.WriteLine("Press Enter to Start.\nAgain Press enter to finish.");
Console.ReadLine();
Task t = new Task(() =>
{
int i = 0;
while (true)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Task Cancel requested");
break;
}
Console.WriteLine(i++);
}
}, token);
t.Start();
// wait for input before exiting
Console.ReadLine();
tokenSource.Cancel();
if(t.Status==TaskStatus.Canceled)
Console.WriteLine("Task was cancelled");
else
Console.WriteLine("Task completed");
}
我发现在极少数情况下,if
block 中的代码不会运行。如果是这样,使用轮询来查看是否请求取消有什么用?
最佳答案
您的代码的问题在于您没有等待 Task
完成。所以,可能发生的是:
- 您调用
Cancel()
。 - 您检查
Status
,它返回Running
。 - 令人困惑的是,当
Task
仍在运行时,您写了“Task completed”。 Main()
完成,应用程序退出。- (此时,
IsCancellationRequested
将从后台线程中检查。但这从未发生,因为应用程序已经退出。)
要解决此问题,请在调用 Cancel()
之后添加 t.Wait()
。
但这仍然不能完全修复您的程序。您需要告诉 Task
它已被取消。为此,您可以抛出包含 CancellationToken
的 OperationCanceledException
(通常的做法是调用 ThrowIfCancellationRequested()
)。
其中的一个问题是 Wait()
处理一个被取消的 Task
会抛出一个异常,因此您必须捕获它。
关于c# - 使用 IsCancellationRequested 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15038529/