我需要从同步方法(不能是异步!)并行发送多个 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 Task.WhenAll()
将所有这些代码包装在正确的
async方法中,并使用
.GetAwaiter.GetResult()
调用它,但这也不是最好的方法,它一直是很多人已经解释过,请看看这个答案:https://stackoverflow.com/a/39371523/9855767