Это то, что я встретил, реорганизовывая некоторый унаследованный код.Различные реализации метода, который возвращает задачу
Рассмотрим метод на интерфейс, который возвращает Task
:
public interface IFoo
{
Task Bar();
}
Реализация Bar
метод может быть реализован двумя способами:
возвращающая Task
:
public class Foo1 : IFoo
{
public Task Bar()
{
return Task.Run(() =>
{
/* some work */
});
}
}
Или с помощью async
... await
:
public class Foo2 : IFoo
{
public async Task Bar()
{
await Task.Run(() =>
{
/* some work */
});
}
}
Являются ли эти реализации функционально эквивалентными или существуют (потенциально тонкие) отличия?
Насколько мне известно, разница не такая, как вы здесь представлены. Когда вы реализуете Foo1, вам нужно вызвать Task.Wait() и для Foo2 просто ждать Task, поэтому есть разница. Объясняется здесь: http://stackoverflow.com/questions/9519414/whats-the-difference-between-task-start-wait-and-async-await –
@RazvanDumitru зачем вообще вызывать 'Task.Wait()'? Что касается вызывающих абонентов, оба метода одинаковы. 'await foo1Instance.Bar();' и 'await foo2Instance.Bar();' будет работать одинаково. Нет причин блокировать первый, чтобы вернуть завершенную задачу. , Вы имели в виду что-то еще? –
Да. Верно.Нет необходимости ждать вообще. Вы можете ждать обоих возвращенных объектов. –