У меня есть интерфейс
interface IFoo
{
Task<Bar> CreateBarAsync();
}
Существует два метода создания Bar
, один асинхронный и один синхронный. Я хочу предоставить реализацию интерфейса для каждого из этих двух методов.
Для асинхронного метода реализация может выглядеть так:
class Foo1 : IFoo
{
async Task<Bar> CreateBarAsync()
{
return await AsynchronousBarCreatorAsync();
}
}
Но КАК я должен реализовать класс Foo2
, который использует синхронный метод для создания Bar
?
Я мог бы реализовать метод для синхронного запуска:
async Task<Bar> CreateBarAsync()
{
return SynchronousBarCreator();
}
Затем компилятор предупреждает об использовании async
в сигнатуре метода:
В этом асинхронном методе отсутствуют операторы "ждут" и будут выполняться синхронно. Подумайте о том, как использовать оператор "ожидание" для ожидания неблокирующих вызовов API или "ждать Task.Run(...)", чтобы выполнять работу с привязкой к процессору в фоновом потоке.
Или я мог бы реализовать метод для явного возврата Task<Bar>
. По-моему, код будет выглядеть менее читаемым:
Task<Bar> CreateBarAsync()
{
return Task.Run(() => SynchronousBarCreator());
}
С точки зрения производительности, я полагаю, что оба подхода имеют одинаковую накладную или?
Какой подход я должен выбрать; внедрить метод async
синхронно или явно обернуть вызов синхронного метода в Task
?
ИЗМЕНИТЬ
Проект, над которым я работаю, действительно представляет собой проект .NET 4 с расширениями async/await из пакета Microsoft Async NuGet. В .NET 4 Task.Run
можно заменить на TaskEx.Run
. Я сознательно использовал метод .NET 4.5 в приведенном выше примере в надежде сделать основной вопрос более понятным.