Существует разница между:
- Вызов
PerformLongRunningWork
, и он вызывает исключение. - Вызов
PerformLongRunningWork
, и он успешно выполняется и возвращает Task<string>
который содержит исключение.
То есть:
Task<string> task;
try
{
task = PerformLongRunningOperation();
}
catch (Exception e)
{
// PerformLongRunningOperation itself threw
}
bool containsException = task.IsFaulted;
try
{
string result = await task;
}
catch (Exception e)
{
// The Task<string> returned from PerformLongRunningWork contained an exception
}
Если вы выбросите исключение из метода async Task
, это исключение будет заключено в Task
, который
Следовательно, ваш пример с не-1019 * методом, который делегирует локальной функции async
, будет выбрасывать эти ArgumentException
непосредственно при вызове, и не будет возвращать их в Task<string>
это возвращается.
Если вы переписали пример для удаления локальной функции и вместо этого сделали PerformLongRunningWork
async
, тогда эти ArgumentExceptions
будут заключены в возвращаемом Task<string>
.
Какой из них Вы хотите сделать, это вопрос дискуссии.