2014-01-09 3 views
5

Я использую WebClient.DownloadFile для загрузки одного файла за раз с веб-сервера, однако, я хочу знать, если по «Блокировка потока» разработчики означают, что приложение не будет реагировать ?DownloadFile vs DownloadFileAsync

Я пробовал использовать WebClient.DownloadFileAsync, но он не работает, как DownloadFile работает, пожалуйста, уточните, и я не могу сказать, потому что я загружаю файлы из своей сети, поэтому он очень быстро загружает мгновенно, спасибо заранее.

PS: Да, я пробовал искать и читать, не мог найти ответ, который мне нужен.

+0

К сожалению, с 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

ответ

6

Редактировать: 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 будет блокировать поток, который его назвал. Если это поток пользовательского интерфейса, то да ... ваше приложение не будет реагировать. Если это не поток пользовательского интерфейса, он все равно будет реагировать, но он будет менее масштабируемым (это означает, что он использует потоки, чтобы ждать, а не выполнять работу, поэтому ваше приложение в целом может делать меньше с тем же количеством потоков)

+0

Я понимаю, что я использую VS 2010, видимо, он не поддерживает ожидание, есть ли другая альтернатива? –

+0

Да. несколько. Вы можете использовать 'async-await' с VS 2010, используя BCL.Async. или вы можете зарегистрировать продолжение задачи с помощью 'ContinueWith':' WebClient.DownloadFileAsync (...). ContinueWith (_ => Console.WriteLine (_. Результат); '. – i3arnon

+0

Спасибо, много, что я искал этот ответ на пару дней, я попробую прямо сейчас :) –

0
client.DownloadFileTaskAsync(new Uri(url), saveLocation).Wait(); 
// Waiting for download... 
Смежные вопросы