C# 对多个任务使用Task.WhenAll时,在foo.Start()上获取错误
我遇到了这样一个错误“不能在承诺式任务上调用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”。那么,我应该怎么做才能使它正常工作呢
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;