Я сейчас делаю что-то похожее на вопрос 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), но этот шаблон также отвечает на вопрос.
Для того, чтобы что-то ждать, оно должно быть ожидаемым. Поскольку 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();
Недавно я обнаружил, что NUnit умеет проверять await
async void
. Вот хорошее описание, как это работает: Как nunit успешно ждет завершения асинхронных методов?
Вы не будете использовать его в обычных задачах, но хорошо знать, что возможно
«Async void предназначен только для обработчиков событий верхнего уровня»,