2014-01-09 2 views
5

WebClient.DownloadFile을 사용하여 웹 서버에서 한 번에 하나의 파일을 다운로드하지만, "스레드가 차단됨"개발자가 응용 프로그램이 응답하지 않는다는 것을 의미하는지 알고 싶습니다. ?DownloadFile 대 DownloadFileAsync

WebClient.DownloadFileAsync를 사용해 보았지만 DownloadFile 작동처럼 작동하지 않습니다. 분명히 말하십시오. 내 네트워크에서 파일을 다운로드하고 있기 때문에 말할 수 없습니다. 미리 다운로드 해 주시면 감사하겠습니다.

추신 : 예 인터넷 검색을 시도하고 읽기 때문에 필요한 답을 찾을 수 없습니다.

+0

불행히도 VS2010에서는 async/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 패턴] (http://blogs.msdn.com/b/pfxteam/archive/2009/06/19/9791857.aspx)을 사용하여 코드를보다 체계적으로 구성 할 수 있습니다. – Noseratio

답변

6

편집 : WebClient.DownloadFileAsync은 "비동기"로 끝나지 만 작업을 반환하지 않습니다. Event-based Asynchronous Pattern의 일부이므로 내 답변과 관련이 없습니다. 이것은 : 비동기 작업이 완료되었을 때를 알기 위해서는 WebClient.DownloadFileCompleted 이벤트에 가입해야합니다.

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은 호출 한 스레드를 차단합니다. UI 스레드 인 경우 그렇다면 앱이 응답하지 않습니다. UI 스레드가 아니라면 여전히 응답 성이 좋지만 확장 성이 떨어집니다 (즉, 작업을 수행하는 대신 스레드가 대기하므로 응용 프로그램 전체가 같은 스레드로 처리 할 수 ​​있습니다)

+0

나는 VS 2010을 사용하고 있는데, 분명히 기다리는 것을 지원하지 않는다는 것을 이해합니다. 다른 대안이 있습니까? –

+0

예. 수개. BCL.Async를 사용하여 VS 2010에서'async-await'을 사용할 수 있습니다. ContinueWith (ContinueWith) : ContinueWith (_ => Console.WriteLine (_. Result);). – i3arnon

+0

고마워요. 내가 많이 찾던 주셔서 감사합니다. 이 대답은 며칠 동안, 나는 그것을 지금 시도 할 것이다 :) –

0
client.DownloadFileTaskAsync(new Uri(url), saveLocation).Wait(); 
// Waiting for download... 
관련 문제