【问题标题】:C#/Tasks/await whenAll(): Better solution than relying on response/request list?C#/Tasks/await whenAll():比依赖响应/请求列表更好的解决方案?
【发布时间】:2017-08-09 09:02:50
【问题描述】:

我正在为以下情况寻找更好的解决方案。目前,我在以下示例中依赖于两个列表的相同顺序。

在 .NET Core/C# 中,我使用的是在后台执行 REST 调用的 SDK。 post 方法是异步的。 代码如下:

var requestTasks = new List<Task<SdkResponseType>>();
foreach (SdkRequest request in requests)
{
    requestTasks.Add(sdkClient.PostAsync(request);
}

var responses = await Task.WhenAll(requestTasks);

之后我想用响应的值更新数据库。 我知道响应的顺序符合请求的顺序(描述为here)。

不幸的是,响应对象不包含向我提示进入请求列表的值。 依赖相同的响应和请求顺序感觉很难看。是否有更好的解决方案,不包含修补 SDK?

我想,我肯定错过了一些代码模式。

提前致谢。

【问题讨论】:

    标签: c# loops task


    【解决方案1】:
    var taskList = emailOperatableCollection.MailjetQueue
        .Select( async emailOperatable => {
            var request = CreateMailJetRequest(emailOperatable,authUseraccount);
            return  new {
               Request = request,
               Result = await sdkClient.PostAsync(request)
            };
         } );    
    var responses = await Task.WhenAll(taskList);
    
    foreach(var response in responses){
        var originalRequest = response.Request;
        var result = response.Result;
    
        ...
    }
    

    【讨论】:

    • 也许,我没有正确理解你的例子,但是编译器说当前上下文中不存在异步。
    • 什么是请求类型?你可以试试requests.ToList().Select如果不起作用请告诉我。
    • 见下面的具体代码。该请求是来自 Mailjet SDK 的对象。
    【解决方案2】:

    @Akash Kava:我认为这更容易,不讨论我上面的伪代码。这是带有异步的 foreach 的方法。该请求是来自 Mailjet SDK 的对象。

        private async void SendEmailCollectionAsync(EmailOperatableCollection emailOperatableCollection, AuthUseraccount authUseraccount)
        {
            var mailjetClient = new MailjetClient(RuntimeEnvironment.BroadcastAdapterMailMailjetPublicKey, RuntimeEnvironment.BroadcastAdapterMailMailjetPrivateKey);
            var mailjetRequestTasks = new List<Task<MailjetResponse>>();
    
            foreach (EmailOperatable emailOperatable in emailOperatableCollection.MailjetQueue)
            {
                var request = CreateMailjetRequest(emailOperatable, authUseraccount);
                mailjetRequestTasks.Add(mailjetClient.PostAsync(request));
            }
    
            var mailjetResponses = await Task.WhenAll(mailjetRequestTasks);
        }
    

    现在我希望将数组 mailjetResponses 中的每个响应分配给列表 emailOperatableCollection.MailjetQueue 中的每个 emailOperatable。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      相关资源
      最近更新 更多