У меня есть метод async, GetExpensiveThing()
, который выполняет некоторую дорогостоящую работу ввода-вывода. Вот как это я использую:Выполнение параллельных асинхронных методов
// Serial execution
public async Task<List<Thing>> GetThings()
{
var first = await GetExpensiveThing();
var second = await GetExpensiveThing();
return new List<Thing>() { first, second };
}
Но поскольку это дорогостоящий метод, я хочу выполнить эти вызовы параллельно. Я бы подумал, перемещающих Awaits решили бы это:
// Serial execution
public async Task<List<Thing>> GetThings()
{
var first = GetExpensiveThing();
var second = GetExpensiveThing();
return new List<Thing>() { await first, await second };
}
Это не сработало, так что я завернул их в некоторых задачах и это работает:
// Parallel execution
public async Task<List<Thing>> GetThings()
{
var first = Task.Run(() =>
{
return GetExpensiveThing();
});
var second = Task.Run(() =>
{
return GetExpensiveThing();
});
return new List<Thing>() { first.Result, second.Result };
}
Я даже пытался играть с ожидающей и асинхронно и вокруг задач, но это действительно запутывало, и мне не повезло.
Есть ли возможность запускать асинхронные методы параллельно или же задачи являются хорошим подходом?
'ждут задачи.WhenAll' вернет 'Thing []', поэтому нет необходимости в 'Result' (фактически,' Result' будет обертывать исключения, вы должны использовать 'await' или использовать результат' waitait Task.WhenAll'). –
Хороший улов, спасибо - рано, и я «ждал» своего кофе. :) –
Хотя это в целом правильный способ, что это делает, что 'return new List() {ждать сначала, ждать второй};' нет? Если OP сказал, что это не сработало, должно быть что-то еще в игре ... –
yaakov