Как передать метод async в качестве входного параметра другому методу? [Дубликат]

Я сейчас делаю что-то похожее на вопрос poser, однако я использую подкласс defaultdict, который имеет функцию-член, которая используется как default_factory. Для того, чтобы мой код работал правильно (мне нужно, чтобы функция была определена во время выполнения), я просто добавил код для подготовки объекта для травления.

Вместо:

...
pickle.dump(dict, file)
...

Я использую это:

....
factory = dict.default_factory
dict.default_factory = None
pickle.dump(dict, file)
dict.default_factory = factory
...

Это не точный код, который я использовал, поскольку мое дерево - это объект, который создает экземпляры того же типа дерева, что и индексы, (поэтому я использую рекурсивный функция-член для выполнения операций pre / post pickle), но этот шаблон также отвечает на вопрос.

26
задан Kirill Kobelev 5 April 2018 в 05:07
поделиться

3 ответа

Для того, чтобы что-то ждать, оно должно быть ожидаемым. Поскольку 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();
42
ответ дан Yuval Itzchakov 17 August 2018 в 10:05
поделиться

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

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

1
ответ дан Community 17 August 2018 в 10:05
поделиться

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

http://channel9.msdn.com/Series/Three-Essential-Tips-for-Async/Tip -1-Асинхронная-пустоты это-для-верхний уровень-события-обработчики только [/ д2]

3
ответ дан Lex Li 17 August 2018 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: