2009-10-30 4 views
1

DB에 연결하고 지정된 프로젝트에 필요한 패키지를 다운로드하는 프런트 엔드 응용 프로그램을 작성 중입니다. 사용자는 더 이상 DL을 시작하지 않고 현재가 끝날 때까지 기다릴 수있는 앱을 닫을 수 있어야하며 강제로 닫아서 현재 다운로드를 끊고 종료하는 옵션이 있어야합니다.스레드/배경 DLing .NET에 사용하는 스레드 방법

다운로드하는 파일이 내 서버가 아닌 여러 서버에있을 수 있습니다. 어떤 종류의 스레드를 사용해야합니까? IIRC에는 .NET에 한 가지 유형이 더 많이있었습니다. 사용자가 즉시 종료하라는 요청을 할 경우 어떤 명령을 사용하여 지금 종료 할 것인가? (다른 종료 후 종료 될 수 있음)?

답변

3

주어진 시나리오에서 비동기 성질 인 HttpWebRequest/WebClient을 사용할 수 있어야합니다.이 스레드는 단지 스레드가 아닌 완료 포트를 사용하여 이미 모든 것을 지원합니다.

"지금 죽이기"다시하십시오. 프로세스를 해체하지 않는 한 스레드를 중단해서는 안됩니다. 이것은 이며 나쁜 것이며 시스템을 손상된 상태 또는 복구 할 수없는 잠금 상태로 둘 수 있습니다. 그러나 도구 자체가 대안을 제공 할 수 있습니다 :

WebClient wc = new WebClient(); 
    wc.DownloadFileCompleted += (sender, args) => 
    { 
     if (args.Cancelled) Console.WriteLine("cancelled"); 
     else if (args.Error != null) Console.WriteLine(args.Error.Message); 
     else Console.WriteLine("got it"); 
    }; 
    wc.DownloadFileAsync(uri, filePath); 
    // wc.CancelAsync(); // to abort 

참고하는 비동기 콜백 (위의 DownloadFileCompleted)은, 윈폼/WPF 같은 것을에서, UI 스레드로 전환해야 할 것입니다에; 예를 들면 다음과 같습니다.

wc.DownloadFileCompleted += (sender, args) => 
    { 
     this.Invoke((MethodInvoker) delegate { 
      if (args.Cancelled) txtStatus.Text = "cancelled"; 
      else if (args.Error != null) txtStatus.Text = args.Error.Message; 
      else txtStatus.Text = "got it"; 
     }); 
    }; 
0

당신이 .NET 2 이상을 사용하는 경우 당신은 아마 ThreadPool.QueueUserWorkItem에 BackgroundWorker componet에서

0

봐 보일 것입니다.

1

스레드 유형은 1 가지이지만 다양한 방법이 있습니다. GUI (WinForms?)로 작업하고 있으므로 BackgroundWorker가 가장 적합합니다.

거기에서 비동기 또는 동기화 I/O를 사용할 수 있습니다.

스레드를 중단 (abort)하지 말고 연결을 닫거나 취소하십시오. 당신이 사용하고자하는 것에 대한 Depnds.

관련 문제