Как заставить метод возвращать запущенную задачу без блокировки? - PullRequest
1 голос
/ 22 февраля 2020

В моем приложении C# я смог запустить параллельные задачи, которые выполняют http-вызовы, а затем дождаться завершения всех из них.

var responseTasks = new List<Task<HttpResponseMessage>>();

// PostChanges makes an async http call and returns the task
responseTasks.Add(myServiceClient.PostChanges(json));
responseTasks.Add(myServiceClient.PostChanges(json));
responseTasks.Add(myServiceClient.PostChanges(json));

Task.WaitAll(responseTasks.ToArray());

Но что, если каждый из вызовов PostChanges полагается на вызов, который получает данные из HTTP-запроса? Какой самый простой способ создать метод, который инкапсулирует два вызова и возвращает запущенную задачу? Метод должен был бы выполнить оба запроса примерно так:

public Task<HttpResponseMessage> GetDataAndPostChanges(MyInput input)
{
    var json = myServiceClient.GetData(input); // this call must complete first
    var response = myServiceClient.PostChanges(json);
    return response; // how to actually return a task immediately that does both calls?
}

Затем я бы хотел сделать параллельные вызовы этого метода и дождаться завершения всех из них.

var responseTasks = new List<Task<HttpResponseMessage>>();

// PostChanges makes an async http call and returns the task
responseTasks.Add(myServiceClient.GetDataAndPostChanges(input1));
responseTasks.Add(myServiceClient.GetDataAndPostChanges(input2));
responseTasks.Add(myServiceClient.GetDataAndPostChanges(input3));

Task.WaitAll(responseTasks.ToArray());

1 Ответ

3 голосов
/ 22 февраля 2020

Сделайте функцию асинхронной c и дождитесь необходимых вызовов

public async Task<HttpResponseMessage> GetDataAndPostChanges(MyInput input) {
    var json = await myServiceClient.GetData(input); // this call must complete first
    var response = await myServiceClient.PostChanges(json);
    return response;
}

Приведенное выше предположение состоит в том, что GetData является асинхронной функцией.

...