Редактировать: WebClient.DownloadFileAsync
заканчивается на «Async», но не возвращает задачу. Это часть Event-based Asynchronous Pattern
, поэтому мой ответ не имеет значения. Это одно: вам нужно подписаться на событие WebClient.DownloadFileCompleted
, чтобы узнать, когда операция async завершена. Например:
var client = new WebClient();
var uri = new Uri(address);
client.DownloadFileCompleted += (sender, e) => Console.WriteLine("Finished");
client.DownloadFileAsync(uri, "Hamsters.txt");
Оригинал Ответ: WebClient.DownloadFileAsync
возвращает задачу, которую нужно ждать. как так:
await WebClient.DownloadFileAsync(...)
DownloadFileAsync
является выстреливает асинхронную операцию и возвращает задачу, которая будет завершена, когда операция закончилась. await
означает, что эта задача заканчивается асинхронным способом, поэтому код после запуска будет выполняться, когда вы получите результат DownloadFileAsync
.
Синхронный DownloadFile
будет блокировать поток, который его назвал. Если это поток пользовательского интерфейса, то да ... ваше приложение не будет реагировать. Если это не поток пользовательского интерфейса, он все равно будет реагировать, но он будет менее масштабируемым (это означает, что он использует потоки, чтобы ждать, а не выполнять работу, поэтому ваше приложение в целом может делать меньше с тем же количеством потоков)
К сожалению, с VS2010 вы не можете использовать 'асинхронный/await' и [' Bcl.Async'] (https://www.nuget.org/packages/Microsoft.Bcl.Async) (который предлагает улучшенный [ 'DownloadFileTaskAsync'] (http://msdn.microsoft.com/en-us/library/hh159424 (v = vs.110) .aspx) API). Тем не менее, вы все еще можете использовать [EAP-to-Task pattern] (http://blogs.msdn.com/b/pfxteam/archive/2009/06/19/9791857.aspx), чтобы сделать ваш код более структурированным. – Noseratio