Подтвердить что ты не робот

Как ждать делегата async

В одном из видео MVA я увидел следующую конструкцию:

static void Main(string[] args)
{
    Action testAction = async () =>
    {
        Console.WriteLine("In");
        await Task.Delay(100);
        Console.WriteLine("First delay");
        await Task.Delay(100);
        Console.WriteLine("Second delay");
    };
    testAction.Invoke();
}

Результатом выполнения будет:

In
Press any key to continue . . .

Он отлично компилируется, но прямо сейчас я не вижу способа подождать. Я мог бы поставить Thread.Sleep или Console.ReadKey после вызова, но это не то, что я хочу.

Итак, как этот делегат должен быть изменен, чтобы стать ожидаемым? (или, по крайней мере, как я могу отслеживать выполнение этого выполнения?)

Есть ли практическое использование таких делегатов?

4b9b3361

Ответ 1

Чтобы ожидание ожидалось, оно должно быть ожидаемым. Поскольку void не так, вы не можете ждать ни одного делегата Action.

Ожидается любой тип, реализующий метод GetAwaiter, который возвращает тип, который реализует, например, INotifyCompletion или ICriticalNotifyCompletion, например Task и Task<T>.

Если вы хотите ждать делегата, используйте Func<Task>, который эквивалентен именованному методу со следующей подписью:

public Task Func()

Итак, чтобы ждать, измените свой метод на:

static void Main(string[] args)
{
    Func<Task> testFunc = async () =>
    {
        Console.WriteLine("In");
        await Task.Delay(100);
        Console.WriteLine("First delay");
        await Task.Delay(100);
        Console.WriteLine("Second delay");
    };
}

И теперь вы можете ждать:

await testFunc();