Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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# 防止Task.ContinueWith出现异常_C#_.net_Task Parallel Library - Fatal编程技术网

C# 防止Task.ContinueWith出现异常

C# 防止Task.ContinueWith出现异常,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,如果第一部分失败,我试图阻止任务继续 我的代码如下所示: Task listener = Task.Factory.StartNew(openConnection).ContinueWith((t) => listenForNumber()); void openConnection() { try { //stuff } catch { //more

如果第一部分失败,我试图阻止任务继续

我的代码如下所示:

Task listener = Task.Factory.StartNew(openConnection).ContinueWith((t) => listenForNumber());

    void openConnection()
    {
        try
        {
           //stuff
        }
        catch
        {
          //morestuff
        }
    }

    void listenForNumber()
    {
       //even more stuff
    }
现在,如果openConnection()进入catch块,则不应执行listenForNuber()

我尝试了
ContinueWith((t)=>listenForNumber(),TaskContinuationOptions.notonfault)

但没有成功,有什么帮助吗(


感谢

TaskContiuationOptions。除非您的方法出现故障,即在执行过程中引发的异常未经处理,否则“无故障”
显然无效


在catch块中,您应该在完成工作(可能需要进行一些清理)后,使用
throw;
语句重新抛出异常(并保留堆栈跟踪)-否则将不会再次引发异常,因此您的方法将不会被视为“有故障”。

您需要在任务方法中引发异常。TPL不知道该方法已失败,除非它捕获到异常

对于出现故障的情况,您仍然需要一个continuation方法。这可能是一个记录异常的简单方法


如果没有异常的延续方法,则当任务方法引发异常时,应用程序中会出现未处理的异常。

创建扩展方法帮助器

public static void PropagateExceptions(this Task task)
{
    if (task == null)
        throw new ArgumentNullException("task");
    if (!task.IsCompleted)
        throw new InvalidOperationException("The task has not completed yet.");

    if (task.IsFaulted)
        task.Wait();
}
然后在执行任何代码之前调用PropagateExceptions()扩展方法。如果任务被取消,PropagateExceptions()方法也将重试

t1.ContinueWith(t => { 
    t.PropagateExceptions();
    listenForNumber(); 
});

您是在catch块中重新抛出还是吞下异常?好的,但是如果我重新抛出异常,那么吞下异常的最佳位置是哪里(以及如何)因此,我不会得到未经用户代码处理的AggregateExection或异常?我不需要再次处理它,因为在第一个catch块中已经完成了所有操作。@Ekoms:据我所知,只有在访问任务的
Result
属性时才会抛出AggregateException。这应该是可以吞下exception的地方但是首先你应该检查它是否真的是你想要吞下的异常,而不仅仅是一些意外的异常。