C# 为什么要处理TaskFactory';C语言中的异常如此困难#
案例1: 它起作用了 案例2:C# 为什么要处理TaskFactory';C语言中的异常如此困难#,c#,exception,plinq,C#,Exception,Plinq,案例1: 它起作用了 案例2: var cts = new CancellationTokenSource(); var tf = new TaskFactory(cts.Token, TaskCreationOptions.AttachedToParent, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default
var cts = new CancellationTokenSource();
var tf = new TaskFactory(cts.Token,
TaskCreationOptions.AttachedToParent,
TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default);
var childTasks = new Task[2];
childTasks[0] = tf.StartNew(async () =>
{
}, TaskCreationOptions.LongRunning);
childTasks[1] = tf.StartNew(() =>
{
throw new Exception("dddddd");
});
try
{
Task.WaitAll(childTasks);
}
catch (AggregateException ae)
{
foreach (var e in ae.Flatten().InnerExceptions)
{
Console.WriteLine(e);
}
}
它不起作用。两者之间的区别只是“异步”
案例3:
....same as 1....
childTasks[1] = tf.StartNew(async () =>
{
throw new Exception("dddddd");
});
....same as 1....
它起作用了
案例4:
childTasks[1] = tf.StartNew( () =>
{
throw new Exception("dd");
//await b();
}).ContinueWith((t) => { Console.WriteLine(t.Exception); }, TaskContinuationOptions.OnlyOnFaulted);
它不工作。异常不写入
太奇怪了!。我想要的是,只有一个地方可以同时处理所有这些异常。但我失败了。有人知道如何处理这种情况吗?请帮帮我,我感觉我快要疯了 您的问题是由于
StartNew
不支持async
。这是
简而言之,您没有看到异常的原因是,将async
lambda传递给StartNew
将返回任务而不是普通的任务
,并且您需要展开嵌套的任务以获得async
方法的结果
您可以按如下方式展开任务:
childTasks[1] = tf.StartNew(async () =>
{
//throw new Exception("dd");
await b();
});
try
{
Task.WaitAll(childTasks);
}
catch (AggregateException ae)
{
foreach (var e in ae.Flatten().InnerExceptions)
{
Console.WriteLine(e);
}
}
private static async Task b()
{
throw new NullReferenceException("未将你妈绑定到实例");
await ........
}
即使wait/async使异步编程变得简单,您仍然需要知道哪些代码在哪个线程中运行,以及这样做的后果是什么——特别是在错误处理方面。
childTasks[1] = tf.StartNew(async () =>
{
throw new Exception("dddddd");
}).Unwrap();