C# 使用错误处理异步处理多个http请求的正确方法
这个解决方案是可行的,但是有没有更好的方法可以通过errorhandling来处理像这样的多个请求呢 下面的代码描述了我想要做的事情,并且绝对有效。但我相信有更好的方法来解决这个问题? 我也尝试过其他选项,但失败了,因为一些请求将返回404C# 使用错误处理异步处理多个http请求的正确方法,c#,rest,http,async-await,C#,Rest,Http,Async Await,这个解决方案是可行的,但是有没有更好的方法可以通过errorhandling来处理像这样的多个请求呢 下面的代码描述了我想要做的事情,并且绝对有效。但我相信有更好的方法来解决这个问题? 我也尝试过其他选项,但失败了,因为一些请求将返回404 public async Task<List<Bruker>> TryGetContactsByContactIds(List<AZContact> contacts) { var tasks = contacts
public async Task<List<Bruker>> TryGetContactsByContactIds(List<AZContact> contacts)
{
var tasks = contacts.Select(c => TryGetContactAsync(c.Email)).Where(c => c.Result != null);
try
{
var tasksresult = await Task.WhenAll(tasks);
return tasksresult.ToList();
}
catch (Exception e)
{
_logger.Error("unable to fetch all", e);
}
return new List<Bruker>();
}
public async Task<Bruker> TryGetContactAsync(string userId)
{
try
{
var user = await _brukereClient.GetAsync(userId);
return user;
}
catch (SwaggerException e)
{
if (e.StatusCode == 404)
{
_logger.Info($"user with Id {userId} does not exist");
}
else
{
_logger.Error("Unable to fetch user", e);
}
}
return null;
}
公共异步任务tryGetContactsByContactId(列出联系人)
{
var tasks=contacts.Select(c=>TryGetContactAsync(c.Email))。其中(c=>c.Result!=null);
尝试
{
var tasksresult=等待任务.WhenAll(任务);
return tasksresult.ToList();
}
捕获(例外e)
{
_logger.Error(“无法获取全部”,e);
}
返回新列表();
}
公共异步任务TryGetContactAsync(字符串用户ID)
{
尝试
{
var user=await\u brukerclient.GetAsync(userId);
返回用户;
}
接住(大摇大摆)
{
如果(例如,状态代码==404)
{
_Info($“Id为{userId}的用户不存在”);
}
其他的
{
_logger.Error(“无法获取用户”,e);
}
}
返回null;
}
您可能正在处理await
的一个功能/限制,该功能/限制只抛出等待任务的一个聚合异常(本例中为whalll
任务)。必须枚举所有任务以处理每个单独的异常
try
{
var tasksresult = await Task.WhenAll(tasks);
return tasksresult.ToList();
}
catch (Exception e)
{
foreach (var task in tasks)
{
if (task.IsFaulted)
{
var taskException = task.Exception.InnerException;
// ^^ Assuming that each task cannot have more than one exception inside its AggregateException.
if (taskException is SwaggerException swaggerException)
{
if (swaggerException.StatusCode == 404)
{
_logger.Info($"user with Id {userId} does not exist");
}
else
{
_logger.Error("Unable to fetch user", swaggerException);
}
}
else
{
_logger.Error("An unexpected task error occurred", taskException);
}
}
}
if (!tasks.Any(t => t.IsFaulted))
{
_logger.Error("A non task-related error occurred", e);
}
}