Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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.WhenAll时,在foo.Start()上获取错误_C#_.net_Task - Fatal编程技术网

C# 对多个任务使用Task.WhenAll时,在foo.Start()上获取错误

C# 对多个任务使用Task.WhenAll时,在foo.Start()上获取错误,c#,.net,task,C#,.net,Task,我遇到了这样一个错误“不能在承诺式任务上调用Start”。因此我注释掉了.Start()。我再试了一次,出现了这样一个错误:“可能无法对已完成的任务调用Start”。那么,我应该怎么做才能使它正常工作呢 var dashboardDailyAgeAnalysis = DailyAgeAnalysesTotalRowsCountAsync(v.BookItOutAccountId, v.ClientMgntAccountNumber, yesterdayDate);

我遇到了这样一个错误“不能在承诺式任务上调用Start”。因此我注释掉了
.Start()
。我再试了一次,出现了这样一个错误:“可能无法对已完成的任务调用Start”。那么,我应该怎么做才能使它正常工作呢

                var dashboardDailyAgeAnalysis = DailyAgeAnalysesTotalRowsCountAsync(v.BookItOutAccountId, v.ClientMgntAccountNumber, yesterdayDate);
                var dashboardDailyBalance = DailyBalanceTotalRowsCountAsync(v.BookItOutAccountId, v.ClientMgntAccountNumber, yesterdayDate);
                var dashboardDailyInventory = DailyInventoryTotalRowsCountAsync(v.BookItOutAccountId, v.ClientMgntAccountNumber, yesterdayDate);

               // dashboardDailyAgeAnalysis.Start();
               // dashboardDailyBalance.Start();
               // dashboardDailyInventory.Start();

                await Task.WhenAll(
                    dashboardDailyAgeAnalysis, dashboardDailyBalance, dashboardDailyInventory
                );

                // Do something with these results.
                var result1 = dashboardDailyAgeAnalysis.Result;
                var result2 = dashboardDailyBalance.Result;
                var result3 = dashboardDailyInventory.Result;

假设您的3个方法返回
Task
,您可以保留初始解决方案以使用
Task。当所有
类似:

int[] results = await Task.WhenAll(
    DailyAgeAnalysesTotalRowsCountAsync(v.BookItOutAccountId, v.ClientMgntAccountNumber, yesterdayDate),
    DailyBalanceTotalRowsCountAsync(v.BookItOutAccountId, v.ClientMgntAccountNumber, yesterdayDate),
    DailyInventoryTotalRowsCountAsync(v.BookItOutAccountId, v.ClientMgntAccountNumber, yesterdayDate)
);
使用
任务。当所有
任务完成时,您一定要等待所有任务完成,即使其中一个任务引发了异常。因此,您可以使用单个try/catch块。如果多个任务失败,将引发一个
聚合异常

它与3个连续的
wait
不同。在连续等待中,如果第一个任务失败,则不会等待下一个任务,并且不会观察到它们的异常。即使捕获到第一个异常,以后也可能引发其他异常并使程序崩溃。您将需要3个不同的try/catch块

注意:在代码示例连续等待2次之后,现在未观察到的异常不会使程序崩溃。解释得很好

使开发人员更容易基于 任务.NET 4.5更改未观察到的任务的默认异常行为 例外情况。而未观察到的例外情况仍将导致 要引发的UnobservedTaskException事件(不这样做将是一个错误) 默认情况下,进程不会崩溃

[……] 请注意,此更改并不意味着开发人员应该对 忽略未处理的异常…这只是意味着运行时更复杂 比以前更宽容了


每个任务都没有单独的返回值这对问题代码没有什么不同。如何访问结果?@fetchsod查看我的更新答案。第一个版本真的太短了,理应得到一个完整的版本-1@JohnathanBarclay如果任务为,则返回给定类型的数组int[]Task@GuillaumeSasdy根据文档,
Task.whalll
返回一个新的
Task
。它不会返回数组中任务的结果。您仍然需要使用
.Result
从每个任务中分别提取它们。为什么
任务。何时全部
?它什么也没做,你确定吗?它不会等到所有3个任务并行运行并完成后再继续执行?而且@Guillaume Sasdy对3个连续等待的缺点非常了解。Guillaume在异常处理方面提出了一个很好的观点,但是任务中的
是多余的。@这不是必需的,但更好。这种行为并不完全相同。我对继续和你们讨论这个问题不感兴趣。@StephenCleary-我没有写这段代码,它被留在那里好几年了。我们只是在将20多个产品和服务迁移到新服务器时遇到了这个错误。由于某些原因,它可以在较旧的服务器上运行&我们不知道,我以前从未见过这一个。如果代码曾经运行过,那是由于.NET Framework中的一个错误。那个密码根本就不应该起作用。祝您在接下来的迁移中好运@史蒂芬克利里-啊,这就解释了。谢谢
        await Task.WhenAll(
            dashboardDailyAgeAnalysis, dashboardDailyBalance, dashboardDailyInventory
        );

        // Do something with these results.
        var result1 = await dashboardDailyAgeAnalysis;
        var result2 = await dashboardDailyBalance;
        var result3 = await dashboardDailyInventory;