Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用错误处理异步处理多个http请求的正确方法_C#_Rest_Http_Async Await - Fatal编程技术网

C# 使用错误处理异步处理多个http请求的正确方法

C# 使用错误处理异步处理多个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

这个解决方案是可行的,但是有没有更好的方法可以通过errorhandling来处理像这样的多个请求呢

下面的代码描述了我想要做的事情,并且绝对有效。但我相信有更好的方法来解决这个问题? 我也尝试过其他选项,但失败了,因为一些请求将返回404

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);
    }
}