防止Task.ContinueWith异常

时间:2011-02-10 14:24:40

标签: c# .net task-parallel-library

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

我的代码看起来像这样:

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.NotOnFaulted);

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

由于

3 个答案:

答案 0 :(得分:8)

除非您的方法出现故障,否则

TaskContiuationOptions.NotOnFaulted显然无效,即在执行期间抛出的异常未处理。

在catch块中,您应该在执行完工作后使用throw;语句重新抛出异常(并保留堆栈跟踪)(可能会进行一些清理) - 否则异常会赢得'再次抛出,所以你的方法不会被视为“有问题”。

答案 1 :(得分:2)

创建扩展方法助手。

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(); 
});

答案 2 :(得分:1)

您需要在任务方法中抛出异常。 TPL不知道方法失败,除非它捕获异常。

您仍需要为故障案例提供延续方法。这可能是记录异常的简单方法。

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