У меня есть интерфейс
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 в приведенном выше примере в надежде сделать основной вопрос более понятным.