2014-11-18 3 views
3

Кажется, что я столкнулся с ответом на этот вопрос в прошлом, но теперь я не могу его найти.Выполнение нескольких методов асинхронного вызова последовательно

Предположим, у меня есть два асинхронных метода Method1 и Method2. Если мне нужно вызвать Method1, а затем Method2 последовательно (чтение, Method1 должно завершиться до Method2), правильно ли следующий код?

await Method1(); 
await Method2(); 

На основании информации, полученной от принятого ответа на другой так вопрос here и информацию в статье MSDN here, я считаю, что это правильный способ сделать это. Кроме того, этот код работает, но я не хочу вводить тонкую ошибку, которая будет намного сложнее отслеживать позже.

ответ

10

Да, это правильный путь. Они будут выполняться последовательно.

Важная цитата из MSDN:

Оператор Await сообщает компилятор, что метод асинхронной не может продолжаться дальше этой точкой, пока ожидаемый асинхронный процесс не будет завершен.

Если вы хотите выполнять их параллельно, вы должны использовать что-то вроде этого:

var t1 = DoTaskAsync(...); 
var t2 = DoTaskAsync(...); 
var t3 = DoTaskAsync(...); 

await Task.WhenAll(t1, t2, t3); 
1

Я знаю, что эта нить немного старый, но я хотел бы добавить проблема, с которой я столкнулся, используя методы async.

Это чисто для понимания, и что-то, что я понял из-за проб и ошибок.

Если вы создаете метод void(), вы не можете await его, если вы не вызовете метод как это:

await Task.Run(() => Method()); 

... с объявлением метода:

void Method() {...} 

Вызов функции с помощью await Task.Run выполняет несколько методов, не дожидаясь выполнения каких-либо предыдущих функций.

Если, например, у вас есть:

void Method1() {...} 
void Method2() {...} 
void Method3() {...} 

И вы называете их, как это:

await Task.Run(() => Method1()); 
await Task.Run(() => Method2()); 
await Task.Run(() => Method3()); 

Операция Await не будет ждать Method1 закончить перед вызовом method2 и т.д.

Чтобы преодолеть это, создайте такую ​​функцию:

async Task Method1() {...} 
async Task Method2() {...} 
async Task Method3() {...} 

И называть их так:

await Method1(); 
await Method2(); 
await Method3(); 
+0

TL; DR Избегайте аннулируются асинхронной https://stackoverflow.com/questions/45447955/why-exactly-is-void-async-bad –

Смежные вопросы