
Multiple Task Continuation @H_502_3@我已经在答案中更改了我的代码,但是现在我在尝试运行任务时收到了TaskCancelledExceptions.
public virtual async Task RunAsync(TaskWithProgress task){ Show(); TaskIsRunning(); await SetCompletedHandler(TaskComplete()); await SetCancelledHandler(TaskCancelled()) await SetFaultedHandler(TaskFaulted()); await task; Close();} @H_502_3@但是以下代码没有.我有点卡住原因. public virtual Task RunAsync(TaskWithProgress task){ Show(); TaskIsRunning(); SetCompletedHandler(TaskComplete()); SetCancelledHandler(TaskCancelled()) SetFaultedHandler(TaskFaulted()); return task;} @H_502_3@调用代码基本上涉及以下内容: await progressDialog.RunAsync(task);@H_502_3@编辑: @H_502_3@我不会在任何地方取消取消,所以我不明白为什么这会抛出异常. @H_502_3@三个SetXXXHandler()方法基本上执行以下具有不同延续状态的代码:
task.ContinueWith(_ => action(),CancellationToken.None,TaskContinuationoptions.OnlyOnCanceled,this.Scheduler);@H_502_3@堆栈跟踪在这里:
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#\FugroDXExt\trunk\frmBaseProgressAsync.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#\FCP\FCP\Forms\frmProcessing.cs:line 578@H_502_3@Close()只是关闭表单.如果我删除该行,则会发生同样的事情.解决方法 你说SetCancelledHandler只是为任务添加了一个延续.我假设RunAsync作为参数获得了相同的任务,尽管我无法通过您的代码告诉SetCancelledHandler如何继续执行任务(我假设我们缺少一些代码).无论如何… @H_502_3@您在任务完成,取消并出现故障时将运行的任务上注册3个延续.现在让我们假设原始任务成功完成而没有被取消.这意味着你的2个延续(OnCanceled和OnFaulted)将不会运行,因为它们不需要.告诉任务不在TPL中运行的方法是取消它,这会自动发生. @H_502_3@您的两个代码段之间的区别在于,在第一个代码片段中等待任务延续,它们会被取消,从而解释您的异常.在第二个片段中,您不等待延续,只是成功运行完成的原始任务. @H_502_3@P.S:我认为第二种选择更合适.您无需等待所有这些延续.如果需要,你想让它们运行. @H_502_3@TL; DR:等待取消的继续任务.继续任务,而不是原始任务,是抛出异常的任务. 总结
以上是内存溢出为你收集整理的c# – 任务取消异常(ThrowForNonSuccess)全部内容,希望文章能够帮你解决c# – 任务取消异常(ThrowForNonSuccess)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)