Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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# 为什么要处理TaskFactory';C语言中的异常如此困难#_C#_Exception_Plinq - Fatal编程技术网

C# 为什么要处理TaskFactory';C语言中的异常如此困难#

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

案例1:

它起作用了

案例2:

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