A quote от @JonSkeet:
Ваш асинхронный метод просто возвращает void, что означает, что не существует простого способа что-либо ожидать его завершения.(Вы почти всегда должны избегать использования асинхронных void-методов. Они действительно доступны только для подписки на события.)
Итак, посмотрите на эту строку вашего кода:
var t = new Task(async () => await AsyncTest());
Посмотрите на сигнатуру Task
конструкторов:
public Task(Action action);
public Task(Action action, CancellationToken cancellationToken);
public Task(Action action, TaskCreationOptions creationOptions);
public Task(Action<object> action, object state);
public Task(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions);
public Task(Action<object> action, object state, CancellationToken cancellationToken);
public Task(Action<object> action, object state, TaskCreationOptions creationOptions);
public Task(Action<object> action, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions);
Все они Actions
и, как вы знаете, Action
имеет void
тип возврата.
static async Task Main(string[] args)
{
// best way to do it
await AsyncTest();
Console.WriteLine("Main finished");
}
private static async Task AsyncTest()
{
// Don't use thread sleep, await task delay is fine
// Thread.Sleep(2000);
await Task.Delay(2000);
Console.WriteLine("Method finished");
}