Резюме. В методе библиотеки, когда следует использовать ключевые слова async
и await
вместо прямого возврата Task
?
Я считаю, что мой вопрос связан с этим. Однако этот вопрос касается .NET 4.0
и TPL, в то время как я использую .NET 4.6 с ключевыми словами async
и await
. Итак, я думаю, что мой вопрос может получить разные ответы, потому что эти ключевые слова не существовали, когда был задан связанный вопрос.
Объяснение: Я пишу простую оболочку для внешней службы WCF, и оболочка делает несколько вызовов SendAsync
. Теперь я думаю, что каждый метод обертки должен просто вернуть Task<>
напрямую, не ожидая. Я понимаю, что async
/await
следует использовать на уровне приложения, а не в библиотеке.
Итак, например, вот такой подход, который, как я думаю, должен взять для каждого метода обертки:
private Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
return _service.SendAsync(request);
}
Но в Интернете я нашел несколько сообщений, которые используют этот подход:
private async Task<SignResponse> GetSignDataAsync(SigningRequestType request)
{
return await _service.SendAsync(request).ConfigureAwait(false);
}
И вот еще один пример, который я нашел в technet:
async Task PutTaskDelay()
{
await Task.Delay(5000);
}
private async void btnTaskDelay_Click(object sender, EventArgs e)
{
await PutTaskDelay();
MessageBox.Show("I am back");
}
Итак, когда я должен использовать второй подход (тот, который включает ключевые слова async
и await
)? Почему бы просто не вернуть целое Task
без создания PutTaskDelay
async
? Я думаю, что я должен возвращать Task
напрямую, когда это возможно, и использовать async
/await
, чтобы получить окончательный результат только на прикладном уровне. Я прав? Если нет, в чем разница между двумя подходами, которые я показываю здесь?
Моя забота. Когда используются ключевые слова async
и await
, кажется, что он просто предоставляет дополнительную работу компилятору без каких-либо преимуществ.