Как canbax уже сказал в своем ответе, оператор await
делает то, что предлагает его наименование. A синхронно ожидает , что Задача (или лучше любой тип, который может быть ожидаемым ) завершена.
Так что, если у вас есть код вроде
DoSomething1();
await DoSomething2Async();
DoSomething3();
вызов DoSomething3
произойдет только после того, как задача, возвращенная вызовом DoSomething2Async
, завершится без ошибок, независимо от того, что происходит в DoSomething2Async
В отличие от этого Вы можете создать задачу, вызвав асинхронный метод c, и только позже ожидайте ее, например:
DoSomething1();
Task task = DoSomething2Async();
DoSomething3();
await task;
, этот код более открыт для порядка вызова DoSomething3
и завершения задачи. , Это потому, что вы в основном говорите компилятору "начать делать DoSomething2Async
, но мне важно, чтобы он завершился после завершения вызова DoSomething3
.
Здесь является живым примером для
using System;
using System.Threading.Tasks;
class Program {
static async Task Main(string[] args) {
DoSomething1();
await DoSomething2Async();
DoSomething3();
Console.WriteLine("---");
DoSomething1();
var task = DoSomething2Async();
DoSomething3();
await task;
}
static void DoSomething1()
{
Console.WriteLine("1");
}
static async Task DoSomething2Async()
{
await Task.Run(() => Console.WriteLine("2"));
}
static void DoSomething3()
{
Console.WriteLine("3");
}
}
, который, как правило, будет производить продукцию типа
1
2
3
---
1
3
2