Есть одно тонкое практическое отличие (кроме версии, в которой await
работает медленнее).
В первом примере, если DownloadString
выдает исключение (вместо вызова делегата, которому вы передаете его с установленным exception
), то это исключение будет всплывать через ваш вызов на DownloadStringAsync
.
Во втором случае исключение упаковывается в Task
, возвращаемый из DownloadStringAsync
.
Итак, предполагая, что DownloadString
выдает это исключение (и никаких других исключений не возникает):
Task<string> task;
try
{
task = httpService.DownloadStringAsync(...);
}
catch (Exception e)
{
// Catches the exception ONLY in your first non-async example
}
try
{
await task;
}
catch (Exception e)
{
// Catches the exception ONLY in your second async example
}
Возможно, вам нет никакого дела до различия - если вы просто напишите:
await httpService.DownloadStringAsync(...);
, вы не заметите разницу.
Опять же, это происходит только в том случае, еслиDownloadString
метод сам кидает.Если вместо этого он вызывает делегата, который вы ему даете с exception
, установленным в значение, то между двумя вашими случаями заметной разницы нет.