AsyncHelper.RunSync
использует взлом пула потоков , чтобы гарантировать, что его делегат вызывается без контекста, что делает его безопасным для блокировки (при условии, что делегат безопасен для вызова в потоке пула потоков ). В вашем коде SomeMethodAsync
выполняется в потоке пула потоков, поэтому любые await
s не будут захватывать контекст .
что можно сделать, чтобы выполнить этот запуск ?
Хорошо, вы бы использовали первый пример кода вместо второго.
Если вы хотите иметь конструкцию, представляющую некоторый код для запуска, вам следует использовать делегат типа типа Func<Task<T>>
. Например:
Func<Task<Result>> func = () => SomeClass.SomeMethodAsync();
Result r = AsyncHelper.RunSync(func);
При асинхронном коде Task<T>
не представляет некоторый код для запуска; он представляет некоторый код, который уже запустил . Используйте Func<Task<T>>
для представления кода для запуска.