【问题标题】:Can this async/await code be rewritten using Task.WhenAll(...) or something else that makes more sense then awaiting each time? [duplicate]可以使用 Task.WhenAll(...) 或其他比每次等待更有意义的东西重写此异步/等待代码吗? [复制]
【发布时间】:2015-07-15 13:05:22
【问题描述】:

我有以下代码(为简洁起见,更改了我的类/对象的名称)。它本质上是在访问一个只允许单个操作的外部 API,但我的服务代码会将其公开为 bulk 类型的请求。

等待每个异步请求似乎不正确,而是分派所有请求并等待所有请求。我可能是错的。

public async void SendSeveralRequestsAsync(MyClass myClass)
{
   var client = SomeExternalServiceClient();

   foreach(var item in myClass)
   {
        var singleAsyncRequest = new ExternalServiceRequest()
        {
            Value = item.Value
        };

        var response = await client.SendAsync(singleAsyncRequest);
   }
}

【问题讨论】:

    标签: c# .net async-await task-parallel-library


    【解决方案1】:

    是的,你应该可以使用类似的东西:

    public async void SendSeveralRequestsAsync(MyClass myClass)
    {
       var client = SomeExternalServiceClient();
       var tasks = myClass
           .Select(item => new ExternalServiceRequest { Value = item.Value })
           .Select(request => client.SendAsync(request));
       await Task.WhenAll(tasks);
    }
    

    或者甚至更好 - 因为我不喜欢从事件以外的异步方法返回 void

    public Task SendSeveralRequestsAsync(MyClass myClass)
    {
       var client = SomeExternalServiceClient();
       var tasks = myClass
           .Select(item => new ExternalServiceRequest { Value = item.Value })
           .Select(request => client.SendAsync(request));
       return Task.WhenAll(tasks);
    }
    

    【讨论】:

    • 这正是我要找的乔恩!感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 2021-10-28
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    相关资源
    最近更新 更多