我不明白为什么,当task.Status =取消时取消是假的
var cancellation = new CancellationTokenSource();
task = Task.Run(() => GetValueToPrint(), cancellation.Token);
cancellation.Cancel();
bool iscancelled = task.Status == TaskStatus.Canceled;
有什么想法吗?
谢谢
答案 0 :(得分:1)
task.Status
将仅等于Canceled
。
Task.Run
来电之前已处于取消状态。Task.Run
内运行的代码抛出了一个OperationCanceledException,并且传递给异常构造函数的令牌是相同的令牌(或linked token相同的令牌传递给Task.Run
您没有上述任何一种情况,因此您的任务可能在检查时处于Running
或RanToCompletion
状态。
如果您希望能够在启动后取消GetValueToPrint()
,则必须将相同的令牌作为参数传递给它,然后在整个方法中,您需要在传入的方法上调用token.ThrowIfCancellationRequested()
在可能取消的地方的令牌。这样做会使你在我上面列出的两个选项中属于#2。
private string GetValueToPrint(CancellationToken token)
{
for(int i = 0; i < 10; i++)
{
Console.WriteLine("Loop");
token.ThrowIfCancellationRequested()
Thread.Sleep(1000);
}
return "42";
}
private void Example()
{
var cancellation = new CancellationTokenSource();
task = Task.Run(() => GetValueToPrint(cancellation.Token), cancellation.Token);
Thread.Sleep(5000);
cancellation.Cancel();
bool iscancelled = task.Status == TaskStatus.Canceled;
Console.WriteLine(iscancelled);
}
你会看到“循环”打印4-6次(它有点竞争条件)然后iscancelled
将是真的;