Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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# 如何使用ContinueWith正确管理任务中的异常_C#_Multithreading_Exception_Task_Faulted - Fatal编程技术网

C# 如何使用ContinueWith正确管理任务中的异常

C# 如何使用ContinueWith正确管理任务中的异常,c#,multithreading,exception,task,faulted,C#,Multithreading,Exception,Task,Faulted,在阅读了有关任务和exepcion管理的信息后,我使用以下代码来管理任务中引发的异常: Task<Object> myTask = Task.Factory.StartNew<Object>(doTask, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); myTask .ContinueWith(task => afterTask(task), TaskSched

在阅读了有关任务和exepcion管理的信息后,我使用以下代码来管理任务中引发的异常:

Task<Object> myTask = Task.Factory.StartNew<Object>(doTask, CancellationToken.None,   TaskCreationOptions.None, TaskScheduler.Default);
myTask .ContinueWith(task => afterTask(task), TaskScheduler.FromCurrentSynchronizationContext());
Task myTask=Task.Factory.StartNew(doTask,CancellationToken.None,TaskCreationOptions.None,TaskScheduler.Default);
myTask.ContinueWith(task=>PostTask(task),TaskScheduler.FromCurrentSynchronizationContext());
其中点任务和后任务是:

private <Object> doTask() {
    throw new Exception("BOOM");
}

private afterTask(Task<Object> aTask) {

        if (aTask.IsFaulted)
        {
            MessageBox.Show(aTask.Exception.InnerException.Message);
        }
        else //whatever
}
private doTask(){
抛出新异常(“BOOM”);
}
专用后任务(任务aTask){
如果(aTask.IsFaulted)
{
Show(aTask.Exception.InnerException.Message);
}
要不然//
}
当抛出异常繁荣时,VisualStudio会显示一个警报,通知尚未捕获异常,但如果我继续执行,则会在后任务函数中处理该异常

这段代码正确吗?或者我误解了任务的一些基本行为?有没有办法避免调试器发出未捕获执行选项的警报?有点烦人

提前感谢

试试这个:

 task.ContinueWith(
            t =>
            t.Exception.Handle(ex =>
                                   {
                                       logger.Error(ex.Message, ex);
                                       return false;
                                   })

            , TaskContinuationOptions.OnlyOnFaulted
            );
通过使用
TaskContinuationOptions.OnlyOnFaulted
,仅当原始任务引发异常时,才可以使用
块运行
continuateWith


另外,您可以选择从传递给
句柄的lambda返回true还是false,以指示是否已处理异常。在我的例子中,我不想阻止异常传播。您可能需要将其更改为返回
true

非常感谢您的快速回答。尽管代码可以工作,但它不会阻止调试器在抛出BOOM时发出异常未被捕获的警报。使用该代码而不是我发布的代码有什么好处吗?在visual studio调试->异常->取消选中commonlanguageruntimeexceptions抛出复选框单击确定主要优点是
ContinueWith
任务仅在抛出异常时运行。在您发布的示例中,任务将始终处于运行状态。第二个优点是可读性。为了防止出现这些VS弹出窗口,我会尝试以下方法:
        try
        {
            var t1 = Task.Delay(1000);

            var t2 = t1.ContinueWith(t =>
            {
                Console.WriteLine("task 2");
                throw new Exception("task 2 error");
            }, TaskContinuationOptions.OnlyOnRanToCompletion);

            var t3 = t2.ContinueWith(_ =>
            {
                Console.WriteLine("task 3");
                return Task.Delay(1000);
            }, TaskContinuationOptions.OnlyOnRanToCompletion).Unwrap();

            // The key is to await for ALL tasks rather than just
            // the first or last task.
            await Task.WhenAll(t1, t2, t3);
        }
        catch (AggregateException aex)
        {
            aex.Flatten().Handle(ex =>
                {
                    // handle your exceptions here
                    Console.WriteLine(ex.Message);
                    return true;
                });
        }