当前位置: 首页 > 编程语言 > C#

TaskCancelException(ThrowForNonSuccess)分享

时间:2023-04-11 03:31:27 C#

TaskCancelException(ThrowForNonSuccess)这是这个问题的延续:Multitaskingcontinuation我在答案中更改了我的代码,但现在我得到了TaskCancelledExceptions。publicvirtualasyncTaskRunAsync(TaskWithProgresstask){Show();任务正在运行();等待SetCompletedHandler(TaskComplete());等待SetCancelledHandler(TaskCancelled())等待SetFaultedHandler(TaskFaulted());下面的代码没有。我有点困惑为什么。publicvirtualTaskRunAsync(TaskWithProgresstask){Show();任务正在运行();SetCompletedHandler(TaskComplete());SetCancelledHandler(TaskCancelled())SetFaultedHandler(TaskFaulted());回归任务;调用代码主要包括以下内容:awaitprogressDialog.RunAsync(task);编辑:我没有在任何地方取消cancellationtoken,所以我不明白为什么会抛出异常。三个SetXXXHandler()方法基本上执行以下具有不同持续状态的代码:task.ContinueWith(_=>action(),CancellationToken.None,TaskContinuationOptions.OnlyOnCanceled,this.Scheduler);堆垛跟踪在这里:在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)d__7.MoveNext()ind:C#FugroDXExttrunkfrmBaseProgressAsync.cs:line92---从先前抛出异常的位置开始的堆栈跟踪结束---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()在System.Runtime。CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在System.Runtime.CompilerServices.TaskAwaiter.GetResult()在FCP.Forms.frmProcessing.d__34.MoveNext()在d:C#FCPFCPFormsfrmProcessing.cs:line578Close()只是关闭表单如果我删除该行,同样的事情会发生。你说SetCancelledHandler只是为任务添加了一个延续。我假设RunAsync获得与参数相同的任务,但我无法通过您的代码告诉SetCancelledHandler如何继续执行任务(我假设我们缺少一些代码)。无论如何...您在任务上注册了3个延续,这些任务将在任务完成、取消和失败时运行。现在让我们假设原始任务成功完成而没有被取消。这意味着您的2个延续(OnCanceled和OnFaulted)将不会运行,因为它们不需要。告诉任务不要在TPL运行的方法是取消它,这是自动发生的。您的两个片段之间的区别在于,在第一个片段中您等待任务继续并且它们被取消,这解释了您的异常。在第二个片段中,您无需等待继续,只需运行已成功完成的原始任务。PS:我觉得第二种方案更合适。您不需要等待所有这些延续。您希望它们在需要时运行。TL;DR:等待取消的延续任务。继续任务,而不是原始任务,是抛出异常的任务。以上就是C#学习教程分享的全部内容:任务取消异常(ThrowForNonSuccess)。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: