ОБНОВЛЕНИЕ Цель этого вопроса - получить простой ответ о Task.Run()
и тупиковой ситуации. Я очень понимаю теоретические рассуждения о том, что вы не смешиваете асинхронные и синхронизирующие сигналы, и я принимаю их близко к сердцу. Я не выше изучения новых вещей от других; Я стараюсь делать это, когда смогу. Там просто раз, когда нужен весь парень, это технический ответ...
У меня есть метод Dispose()
, который должен вызвать метод async. Поскольку 95% моего кода является асинхронным, рефакторинг не лучший выбор. Наличие IAsyncDisposable
(среди других функций), которое поддерживалось каркасом, было бы идеальным, но мы еще не были там. Поэтому в то же время мне нужно найти надежный способ вызова асинхронных методов из синхронного метода без блокировки.
Я бы предпочел не использовать ConfigureAwait(false)
, потому что это оставляет ответственность, разбросанную по всему моему коду, чтобы вызываемый мог вести себя определенным образом, только если вызывающий является синхронным. Я бы предпочел сделать что-то в синхронном методе, так как это девиантный bugger.
После прочтения слова Стивена Клири в другом вопросе, который Task.Run()
всегда расписывает в пуле потоков даже методы async, это заставило меня подумать.
В .NET 4.5 в ASP.NET или в любом другом контексте синхронизации, который планирует задачи для текущего потока/одного потока, если у меня есть асинхронный метод:
private async Task MyAsyncMethod()
{
...
}
И я хочу называть это синхронным методом, могу ли я просто использовать Task.Run()
с Wait()
, чтобы избежать взаимоблокировок, поскольку он ставит асинхронный метод в пул потоков?
private void MySynchronousMethodLikeDisposeForExample()
{
// MyAsyncMethod will get queued to the thread pool
// so it shouldn't deadlock with the Wait() ??
Task.Run((Func<Task>)MyAsyncMethod).Wait();
}