2017-12-21 8 views
1

C#에서 C# WPF 응용 프로그램을 만들었습니다. 필자는 WebClient.DownloadFile을 사용하여 인터넷에서 큰 파일을 다운로드합니다.큰 파일을 인터넷에서 다운로드 할 때 C# 응용 프로그램의 UI가 응답하지 않게하는 방법

이렇게하면 응용 프로그램의 UI가 응답하지 않게됩니다. 오래 동안 응용 프로그램을 다운로드하지 않으면 정상적으로 돌아갑니다.

코드 자체는 UI 스레드에서 호출되는 다른 스크립트에 있습니다. UI가 응답하지 않게하려면 어떻게합니까?

+0

대답은 그것은 분명 그렇지? 다른 스레드에서 파일 다운로드 –

+1

다중 스레드를 사용합니다. – waka

+3

대용량 데이터를 처리하는 동안 반응 형 UI를 유지하려면 어떻게합니까?] (https://stackoverflow.com/questions/4539369/how-do-i-keep-a-responsive-u-while-processing) -large-amount-of-data) –

답변

7

WebClient.DownloadFileAsync 메서드를 사용하면 작업자 스레드에서 파일을 다운로드 할 수 있습니다. UI 스레드는이 프로세스 동안 응답을 유지합니다.

방법 설명서를 멋지게 설명 :

이 방법은 주소 매개 변수에 의해 지정된 URI에 리소스를 다운로드합니다. 다운로드가 성공적으로 완료되면 다운로드 파일의 이름은 로컬 컴퓨터에서 fileName입니다. 파일은 스레드 풀에서 자동으로 할당 된 인 스레드 리소스를 사용하여 비동기 적으로 다운로드 한 입니다. 파일을 사용할 수있을 때 알림을 받으려면 DownloadFileCompleted 이벤트에 이벤트 처리기를 추가하십시오.

이 메서드는 리소스가 인 동안 호출하는 스레드를 차단하지 않습니다. 다운로드가 완료되기를 기다리는 동안 차단하려면 은 DownloadFile 메소드 중 하나를 사용하십시오.

CancelAsync 메서드를 사용하여 완료되지 않은 비동기 작업 을 취소 할 수 있습니다. 이 같은

-1

사용 무언가 :

... //You earlier code 
await Task.Run(() => /*your large file downloading code */); 
...//Your later code 
+2

Task.Run은 IO 바운드 작업이 아닌 CPU 바운드 작업을 위해 예약되어야합니다. async/await만이 원하는 것입니다. – Crowcoder

+0

@Crowcoder 싱크 코드를 비동기로 래핑하는 가장 좋은 방법입니다. async/await 구현에 대한 자세한 내용은 https://docs.microsoft.com/ru-ru/dotnet/standard/async-in-depth에서 확인하십시오. .NET 비동기 메소드에서 사용되는 것과 동일한 메커니즘이 있음을 알 수 있습니다. – Dmitriy

+1

나는 그것을 실제로 읽었습니다. 그래서 Task.Run에서 IO 바운드 코드를 실행하는 것이 낭비라는 것을 알고 있습니다. OP가 동기식 코드로 제한된다는 것은 없습니다. – Crowcoder