如何正确等待多个 I/O 任务并进行单独的异常处理?

问题描述 投票:0回答:1

我需要从同步方法(不能是异步!)并行发送多个 HTTP 调用 (

httpclient.SendAsync()
),然后等待所有调用。另一个要求是:我必须单独处理异常。这意味着,我必须知道哪个任务导致了哪个异常才能对它们进行正确排序。

到目前为止我的解决方案:

var listOfRequests = new List<int>()
 {1,2,3,4,5,6,7,8};

var tasks = new Dictionary<int, Task<SomeData>>();

//start all tasks
foreach (var curr in listOfRequests)
{
    tasks.Add(curr.Key, httpclient.GetSomeDataFromEndpoint(curr));
}

//wait for all tasks to complete
foreach (var currTask in tasks)
{
    try
    {
        currTask.Value.Wait();
    }
    catch (Exception ex)
    {
        //handle individual exception
    }
}

我知道,这不是最佳实践,但是我如何通过

Task.WhenAll()
实现这一目标? 我想到了这个主意,但它看起来也不太好......

try
{
    // Wait for all tasks to complete synchronously
    Task.WhenAll(tasks.Values).Wait();
}
catch (Exception ex)
{
    //do nothing, because exceptions are handled below
}
foreach (var task in tasks)
{
    if (task.Value.IsCompletedSuccessfully)
    {
        Console.WriteLine($"Success: {task.Key} - Status: {task.Value.IsCompleted}");
    }
    else if (task.Value.IsFaulted)
    {
        Console.WriteLine($"Exception: {task.Key} - Message: {task.Value.Exception}");
    }
    else
    {
        //maybe task was cancelled
    }
}
  • 我不能使用await,因为封闭方法必须是synchron!
  • 我认为当我将它们添加到字典中时,所有任务都已经开始了(正如我在异步编程场景 - 等待多个任务完成中看到的那样),但似乎我的http调用是按顺序发送到API的(我看到这在 API 日志中),所以我想我的客户端代码和我等待此任务的方式可能是错误的......

提前致谢!

c# asynchronous parallel-processing task
1个回答
0
投票

如果您的封闭方法必须是非异步的,一个快速技巧可能是使用 await Task.WhenAll() 将所有这些代码包装在正确的

async
方法中,并使用
.GetAwaiter.GetResult()
调用它,但这也不是最好的方法,它一直是很多人已经解释过,请看看这个答案:https://stackoverflow.com/a/39371523/9855767

© www.soinside.com 2019 - 2024. All rights reserved.