Это обычная ситуация с интерфейсами ... Если у вас есть контракт, в котором необходимо указать task
для Асинхронного шаблона ожидания , и мы должны реализовать это Task
в интерфейсе .
Предполагая, что вызывающий абонент будет использовать await
, вы можете просто сбросить async
и вернуть Task
.
Однако вы должны быть осторожны со своими исключениями .Предполагается, что исключения помещены в задачу .Таким образом, чтобы сохранить эту ситуацию, звонящий будет ожидать, что вам придется обращаться с ними немного по-другому.
Обычное использование
Стандарт async
public async Task<string> PullText()
{
using (var reader = File.OpenText("Words.txt"))
{
return await reader.ReadToEndAsync();
}
}
Возвращение Task
для Процессор с привязкой работа (захват)исключение и размещение его на Task
)
public Task<string> PullText()
{
try
{
return Task.Run(() => DoCpuWork());
}
catch (Exception e)
{
return Task.FromException<string>(e);
}
}
Немного менее эффективно, так как мы подключаем IAsyncStateMachine
public async Task<string> PullText()
{
return await Task.Run(() => DoCpuWork());
}
Возвращение завершено Task
с простыми результатами (захват исключения и помещение его в Task
)
public Task<string> PullText()
{
try
{
// simplified example
return Task.FromResult("someString");
}
catch (Exception e)
{
return Task.FromException<string>(e);
}
}
Существует также третий подход, вы можете использовать ключевое слово async
и pragma
изПредупреждения, это заботится о семантике ошибок для вас.Мне это кажется немного грязным, просто потому что это выглядит грязно и необходимость pragma
вывести предупреждение, хотя я теперь видел, как это используется в специальных библиотеках производства
#pragma warning disable 1998
public async Task<string> PullText()()
#pragma warning restore 1998
{
return Task.Run(() => "hello world");
}
и
#pragma warning disable 1998
public async Task<string> PullText()()
#pragma warning restore 1998
{
return Task.FromResult("someString");
}
Примечание Все вышеперечисленное касается возврата Task<T>
из метода.Если кто-то просто хотел вернуть Task
, вы можете воспользоваться Task.CompletedTask;
с той же семантикой ошибок, что и выше.