小编Def*_*iss的帖子

为什么抛出OperationCanceledException会得到不同的结果?

我的同事玩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(在这两种情况下都会导致"取消"结果),但无论如何我无法解释为什么会发生这种情况.

c# task-parallel-library

5
推荐指数
1
解决办法
609
查看次数

标签 统计

c# ×1

task-parallel-library ×1