相关疑难解决方法(0)

为什么会发生TaskCanceledException?

我有以下测试代码:

void Button_Click(object sender, RoutedEventArgs e)
{
    var source = new CancellationTokenSource();

    var tsk1 = new Task(() => Thread1(source.Token), source.Token);
    var tsk2 = new Task(() => Thread2(source.Token), source.Token);

    tsk1.Start();
    tsk2.Start();

    source.Cancel();

    try
    {
        Task.WaitAll(new[] {tsk1, tsk2});
    }
    catch (Exception ex)
    {
        // here exception is caught
    }
}

void Thread1(CancellationToken token)
{
    Thread.Sleep(2000);

    // If the following line is enabled, the result is the same.
    // token.ThrowIfCancellationRequested();
}

void Thread2(CancellationToken token)
{
    Thread.Sleep(3000);
}
Run Code Online (Sandbox Code Playgroud)

在线程方法中,我不会抛出任何异常,但是我会TaskCanceledException进入try-catch启动任务的外部代码块.为什么会发生token.ThrowIfCancellationRequested(); …

c# task-parallel-library c#-5.0

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

谁取消了我的任务?

我的C#任务正在取消,但不是我.我没有得到堆栈跟踪,我无法弄清楚问题发生的位置.

我的任务调用如下所示:

var t = Task<Boolean>.Factory.StartNew(() =>
    {
        Boolean bOk = DoSomthingImportant();
        return bOk;
    }, TaskCreationOptions.AttachedToParent)
    .ContinueWith<Boolean>((theTask) =>
    {
        var reason = theTask.IsCanceled ? "it was canceled" : "it faulted";
        Debug.WriteLine("Error: Task ended because " + reason + ".");
        ... log the exception to one of my objects...
        return false;
    }, TaskContinuationOptions.NotOnRanToCompletion);
Run Code Online (Sandbox Code Playgroud)

如果任务出现故障或被取消,我希望继续运行任务,但如果运行正常则不行.永远不会执行继续.

稍后我的程序会捕获一个包含TaskCanceledException的AggregateException.

我与我的任务的另一个主要交互是调用WaitAny(taskArray,timeout)直到我没有更多的任务要启动,然后在上一个任务完成之前调用WaitAll没有超时.

WaitAny有超时会导致取消吗?为什么我的继续没有被调用?

这只是我对Task库的第二次刷,所以我一无所知.

更新:

我发现了这个问题:如何将任务的已取消状态传播到延续任务.我上面的代码中的一个错误(但不是取消的原因)是我假设Continuation任务状态与原始任务的状态相同.事实上,你必须做一些工作来从另一个中获取一个,正如另一篇文章所描述的那样.

更新2:

布莱恩:感谢文件参考.我已经搜索了一个任务被取消的替代原因的高低搜索,但是错过了这些词:

"如果您正在等待转换到Canceled状态的Task,则会生成并抛出一个Task(包含在AggregateException中).请注意,此异常表示成功取消而不是出现故障.因此,Task的Exception属性返回null. "

.net c# task-parallel-library

8
推荐指数
1
解决办法
2009
查看次数

标签 统计

c# ×2

task-parallel-library ×2

.net ×1

c#-5.0 ×1