iquellis
iquellis

Reputation: 1053

C#/Tasks/await whenAll(): Better solution than relying on response/request list?

I am looking for a better solution for the following case. Currently I am relying on the same order of the two lists in the following example.

In .NET Core/C# I am using a SDK that performs REST calls under the hood. The post method is async. The code looks like that:

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

var responses = await Task.WhenAll(requestTasks);

After that I want to update the DB with the values of the response. I know that the order of responses fits to the order of requests (described here).

Unfortunately, the response objects does not contain a value that gives me a hint to the entry request list. It feels ugly to rely on the same order of responses and requests. Is there a better solution that does not contain patching the SDK?

I think, I am surely missing some code pattern.

Thanks in advance.

Upvotes: 1

Views: 131

Answers (2)

Akash Kava
Akash Kava

Reputation: 39916

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;

    ...
}

Upvotes: 2

iquellis
iquellis

Reputation: 1053

@Akash Kava: I think it's easer, not to discuss on my pseudo code above. This is method with the foreach with an async. The request is an object from the 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);
    }

Now I want every response in the the array mailjetResponses to be assigned to every emailOperatable in the List emailOperatableCollection.MailjetQueue.

Upvotes: 0

Related Questions