加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 任务取消异常(ThrowForNonSuccess)

发布时间:2020-12-15 08:30:18 所属栏目:百科 来源:网络整理
导读:这是这个问题的延续: Multiple Task Continuation 我已经在答案中更改了我的代码,但是现在我在尝试运行任务时收到了TaskCancelledExceptions. public virtual async Task RunAsync(TaskWithProgress task){ Show(); TaskIsRunning(); await SetCompletedHan
这是这个问题的延续:
Multiple Task Continuation

我已经在答案中更改了我的代码,但是现在我在尝试运行任务时收到了TaskCancelledExceptions.

public virtual async Task RunAsync(TaskWithProgress task)
{
    Show();
    TaskIsRunning();
    await SetCompletedHandler(TaskComplete());
    await SetCancelledHandler(TaskCancelled())
    await SetFaultedHandler(TaskFaulted());
    await task;
    Close();
}

但是以下代码没有.我有点卡住原因.

public virtual Task RunAsync(TaskWithProgress task)
{
    Show();
    TaskIsRunning();
    SetCompletedHandler(TaskComplete());
    SetCancelledHandler(TaskCancelled())
    SetFaultedHandler(TaskFaulted());
    return task;
}

调用代码基本上涉及以下内容:

await progressDialog.RunAsync(task);

编辑:

我不会在任何地方取消取消,所以我不明白为什么这会抛出异常.

三个SetXXXHandler()方法基本上执行以下具有不同延续状态的代码:

task.ContinueWith(_ => action(),CancellationToken.None,TaskContinuationOptions.OnlyOnCanceled,this.Scheduler);

堆栈跟踪在这里:

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at FugroDXExt.frmBaseProgressAsync.<RunAsync>d__7.MoveNext() in d:C#FugroDXExttrunkfrmBaseProgressAsync.cs:line 92
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   at FCP.Forms.frmProcessing.<mnuApplyCenteredSmoothing_ItemClick>d__34.MoveNext() in d:C#FCPFCPFormsfrmProcessing.cs:line 578

Close()只是关闭表单.如果我删除该行,则会发生同样的事情.

解决方法

你说SetCancelledHandler只是为任务添加了一个延续.我假设RunAsync作为参数获得了相同的任务,尽管我无法通过您的代码告诉SetCancelledHandler如何继续执行任务(我假设我们缺少一些代码).无论如何…

您在任务完成,取消并出现故障时将运行的任务上注册3个延续.现在让我们假设原始任务成功完成而没有被取消.这意味着你的2个延续(OnCanceled和OnFaulted)将不会运行,因为它们不需要.告诉任务不在TPL中运行的方法是取消它,这会自动发生.

您的两个代码段之间的区别在于,在第一个代码片段中等待任务延续,它们会被取消,从而解释您的异常.在第二个片段中,您不等待延续,只是成功运行完成的原始任务.

P.S:我认为第二种选择更合适.您无需等待所有这些延续.如果需要,你想让它们运行.

TL; DR:等待取消的继续任务.继续任务,而不是原始任务,是抛出异常的任务.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读