C# 为什么我在异步应用程序中没有捕获异常?
我已经阅读了一些内容,比如here(),我认为C# 为什么我在异步应用程序中没有捕获异常?,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,我已经阅读了一些内容,比如here(),我认为async Task方法的行为是: 当使用Wait或Task.Wait时,您可以正常尝试/捕获它们,例如try{Wait X();}catch(异常SqlException e){…} 如果让它“冒泡”,您将得到aggregateeexception 但我发现我的应用程序只是终止,根本没有中断异常。我的代码如下所示: internal async Task RunAsync() { var tasks = monito
async Task
方法的行为是:
Wait
或Task.Wait
时,您可以正常尝试/捕获它们,例如try{Wait X();}catch(异常SqlException e){…}
aggregateeexception
internal async Task RunAsync()
{
var tasks = monitors.Select((p) => p.Value.MonitorAsync()).ToList();
await Task.WhenAny(tasks);
Console.WriteLine("ONE");
}
public static async Task Main(string[] args)
{
var app = new App();
try
{
await app.RunAsync();
Console.WriteLine("TWO");
}
catch(Exception e)
{
Console.WriteLine(e);
}
}
在“1”和“2”上设置断点,我可以看到任务
至少有一个任务
状态为故障,t
状态为RANTO完成。因此,故障状态丢失,没有异常
很明显,我遗漏了一些明显的东西,我应该做些什么不同的事情
顺便说一句,当使用任何来检测异常终止时,这些任务只应在出现故障时退出。这更像是一个了解捕获异常的测试平台。这是因为
WhenAny
。请检查:
返回的任务将在提供的任何任务完成后完成
完整的。返回的任务将始终以RANTO完成结束
将结果集设置为要完成的第一个任务的状态这是真的
即使要完成的第一个任务以“已取消”或“出现故障”结束
状态。
(强调矿山)
这意味着当任何任务出现故障时,wheny
都不会引发异常
这与
WhenAll
相反,WhenAll会在它等待出现故障的任何任务出现未处理的异常时引发异常。这是因为whenay
。请检查:
返回的任务将在提供的任何任务完成后完成
完整的。返回的任务将始终以RANTO完成结束
将结果集设置为要完成的第一个任务的状态这是真的
即使要完成的第一个任务以“已取消”或“出现故障”结束
状态。
(强调矿山)
这意味着当任何任务出现故障时,wheny
都不会引发异常
这与whalll相反,whalll会在它等待的任何任务出现故障时引发异常,并且出现未经处理的异常。谢谢,仔细想想,这是有道理的。。。当一个任务失败时,任何一个任务正常完成时,所有任务都异常完成。那么,您的建议是我应该简单地使用
whalll
,还是有其他好的选择?WhenAny
是好的,当您只想在任何任务以某种方式运行到完成时继续。如果您想检查任何任务是否失败,那么您应该使用whalll
,这是正确的做法。谢谢,当您考虑它时,这是有意义的。。。当一个任务失败时,任何一个任务正常完成时,所有任务都异常完成。那么,您的建议是我应该简单地使用whalll
,还是有其他好的选择?WhenAny
是好的,当您只想在任何任务以某种方式运行到完成时继续。如果要检查任何任务是否失败,则应使用whalll
,这是正确的做法。