我的同事玩TPL并取消任务.他向我展示了以下代码:
var cancellationToken = cts.Token;
var task = Task.Run(() =>
{
while (true)
{
Thread.Sleep(300);
if (cancellationToken.IsCancellationRequested)
{
throw new OperationCanceledException();
}
}
}, cancellationToken)
.ContinueWith(t => {
Console.WriteLine(t.Status);
});
Thread.Sleep(200);
cts.Cancel();
Run Code Online (Sandbox Code Playgroud)
这版画"取消"符合市场预期,但如果你只是发表评论,而像这样的一行:
// ..
//while (true)
{
Thread.Sleep(300);
if (cancellationToken.IsCancellationRequested)
{
throw new OperationCanceledException();
}
}
//..
Run Code Online (Sandbox Code Playgroud)
你会得到"故障".我很清楚ThrowIfCancellationRequested()方法,我应该在OperationCanceledException的构造函数中传递cancellationToken(在这两种情况下都会导致"取消"结果),但无论如何我无法解释为什么会发生这种情况.