提问人:jumpingSloth 提问时间:8/26/2023 更新时间:8/26/2023 访问量:48
如何在 for 循环中并发运行异步函数并在 C 中捕获所有错误#
How to run async functions concurrently in a for loop AND catch all errors in C#
问:
我正在尝试对许多项目执行异步函数。此外,我想捕获此函数中可能抛出的所有错误。
运行以下代码时,我仍然收到“未处理的异常”错误,而不是 WriteLine 语句为每个项目打印的实际错误消息“某些错误”。
public async Task RunEachItem()
{
var tasks = new List<Task>();
foreach (var item in Items)
{
tasks.Add(SomeAsyncFunc(item.Index));
}
try
{
await Task.WhenAll(tasks);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
public async Task SomeAsyncFunc(int index)
{
// somehow process item using index parameter
throw new Exception("some error");
}
我将非常感谢任何帮助,因为我没有找到如何使用谷歌或人工智能工具完成此操作。
答:
0赞
Georgy Tarasov
8/26/2023
#1
您必须使用包含所有任务的可等待任务的属性。Exception.InnerExceptions
class Foo
{
public async Task RunEachItem()
{
var tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
tasks.Add(SomeAsyncFunc(i));
}
Task t = null!;
try
{
t = Task.WhenAll(tasks);
await t;
}
catch(Exception e)
{
var all = t.Exception.InnerExceptions;
foreach (Exception exception in all)
{
Console.WriteLine(exception.Message);
}
}
}
public async Task SomeAsyncFunc(int index)
{
// somehow process item using index parameter
throw new Exception($"some error {index}");
}
}
此代码的输出将是
some error 0
some error 1
some error 2
...
评论
1赞
jumpingSloth
8/26/2023
多谢!这种方法效果很好,而且比我发布的方法更简单。
-1赞
jumpingSloth
8/26/2023
#2
在进一步搜索了 Google 的深度之后,我找到了这篇关于该主题的文章。
似乎围绕 the only 的 try-catch 语句捕获了第一个异常。因此,您需要用“缓冲区调用”包围异步函数,如下所示:await Task.WhenAll(tasks)
private async Task BufferCall(int index)
{
try
{
await someAsyncFunc(index);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
// ...
tasks.Add(BufferCall(item.Index));
现在唯一的问题是,如果函数仍然以这种方式并发运行......
评论
0赞
Georgy Tarasov
8/26/2023
我认为如果作者想在过程结束时汇总所有引发的异常,这不是正确的方法
评论
e.Message
e.GetType()
InnerExceptions
AggregateException
tasks[i].Exception
async
SomeAsyncFunc
SomeAsyncFunc
Task.Run