Вопрос: Как ждать делегата async


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

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

    testAction.Invoke();
}

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

In
Press any key to continue . . .

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

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

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


26


источник


Ответы:


Для того, чтобы что-то ждать, оно должно быть awaitable , В виде 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();

43



«Async void - только для обработчиков событий верхнего уровня»,

http://channel9.msdn.com/Series/Three-Essential-Tips-for-Async/Tip-1-Async-void-is-for-top-level-event-handlers-only


3



Недавно я обнаружил, что NUnit способен await  async voidтесты. Вот хорошее описание, как это работает: Как nunit успешно ждет завершения асинхронных методов?

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


1