Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务取消异常(ThrowForNonSuccess)_C#_.net_Asynchronous_Task Parallel Library_Async Await - Fatal编程技术网

C# 任务取消异常(ThrowForNonSuccess)

C# 任务取消异常(ThrowForNonSuccess),c#,.net,asynchronous,task-parallel-library,async-await,C#,.net,Asynchronous,Task Parallel Library,Async Await,这是这个问题的延续: 我已经更改了答案中的代码,但是现在我在尝试运行任务时收到taskcancelledeexceptions public virtual async Task RunAsync(TaskWithProgress task) { Show(); TaskIsRunning(); await SetCompletedHandler(TaskComplete()); await SetCancelledHandler(TaskCancelled()

这是这个问题的延续:

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

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);
编辑:

我不会在任何地方取消
cancellationtoken
,因此我不明白为什么会引发该异常

三个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#\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
在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)中
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在d:\C\#\FugroDXExt\trunk\frmBaseProgressAsync.d#u 7.MoveNext()中的FugroDXExt.frmBaseProgressAsync.d#u 7.MoveNext()处:第92行
---来自引发异常的上一个位置的堆栈结束跟踪---
在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在System.Runtime.CompilerServices.TaskAwaiter.GetResult()中
在d:\C\#\FCP\FCP\Forms\frmProcessing.cs中的FCP.Forms.frmProcessing.d_u34.MoveNext()处:第578行

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

您说
SetCancelledHandler
只是向任务添加了一个延续。我假设这与
RunAsync
作为参数获取的任务相同,尽管我无法通过您的代码判断
setcanceledhandler
如何获取要继续执行的任务(我假设我们缺少一些代码)。无论如何

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

您的两个代码片段之间的区别在于,在第一个代码片段中,您等待任务继续,然后它们被取消,这解释了您的异常。在第二个代码段中,您不等待继续,只等待成功运行到完成的原始任务

附言:我认为第二种选择更合适。你不需要等待所有这些延续。如果他们需要,你想让他们跑


TL;DR:您等待一项已取消的继续任务。引发异常的是延续任务,而不是原始任务。

最有可能的是,某个地方的某个代码正在取消
CancellationToken
。这很奇怪,不是。我取消了我的
cancellationToken.Cancel()
的挂钩,但它仍然存在。堆栈跟踪是什么?Close()在这里是什么意思?到底是哪一行引发了异常?'await prog.RunAsync'调用