2017-04-14 2 views
1

WebRequest와 Streams를 통해 동시에 두 개의 파일을 다운로드하는 다운로더를 만들려고합니다.메서드 복사로 작업 시작

그리고 새로운 작업을 시작할 때 동일한 방법을 공유하고 있습니다.

두 파일을 다운로드 할 수 없게 만드는 이유는 새 작업이나 스레드를 만들어 메서드 복사본을 만들 수 있습니까?

내가 뭘하려 : 제론 반 Lagen가 언급 한 바와 같이

for (int i = 0; i < dataGridView.RowCount; i++) // 
{ 
    for (m_ThreadIndex = 0; m_ThreadIndex < 2; m_ThreadIndex++) 
    { 
     m_Downloader.DownloadProgressChanged += DownloadProgressChanged; 
     m_Downloader.DownloadCompleted += DownloadCompleted; 
     var i1 = i; 
     Task.Factory.StartNew(() => m_Downloader.Start(i1)); 
     i++; 
    } 
    Task.WaitAll(); 
} 
+1

여러 작업이 동일한 방법으로 실행될 수 있습니다. 각 스레드는 자체 스택 메모리를 가지고 있으므로 모든 로컬 변수 등은 공유되지 않습니다. 메소드의 '복사'가 불가능합니다. 인덱스 대신 각 태스크의 데이터를 전달해야합니다. 동일한 필드/속성 데이터를 사용하지 않아야합니다. 여러 Downloader 클래스 인스턴스를 만들어야합니다. –

+0

'm_Downloader'는'BackgroundWorkerThread'입니까? –

+0

@ JeroenvanLangen 그것은 당신이 말한 것의 절반을 이해하는 데있어 깊이있는 것 같습니다. 인덱스는 행만 표시하는 것입니다. BackGroundWorkerThread에 관해서는 그렇게 생각하지 마십시오. – Dannz

답변

1

,이 방법의 사본을 만들 수 없습니다. 대신 새 클래스를 만들어 클래스에 넣을 수 있습니다. 그런 다음 여러 클래스 인스턴스를 만들 수 있습니다.

Class MyMainClass 
{ 
    private void StartDownload() 
    { 
     var downloaderThread1 = new Downloader(); 
     var downloaderThread2 = new Downloader(); 
     var task1 = downloaderThread1.DownloadFileAsync(remoteAddress, downloadPath); 
     var task2 = downloaderThread2.DownloadFileAsync(remoteAddress, downloadPath); 
     Task.WaitAll(); 
    } 

    class Downloader 
    {   
     public async Task DownloadFileAsync(string remoteAddress, string downloadPath) 
     { 
      var client = new WebClient(); 
      client.DownloadProgressChanged += Client_DownloadProgressChanged; 
      client.DownloadFileCompleted += Client_DownloadFileCompleted; 
      await client.DownloadFileTaskAsync(remoteAddress, downloadPath); 
     } 
    } 
} 
+0

감사합니다.이 솔루션을 구현하고 최대한 빨리 수락하겠습니다. – Dannz

+0

@ Danz, 대단히. 내가 더 이상 도움이 될 수 있다면 알려줘. – Anthony

+0

내 작업이 기다리고 있지 않을 때 또 다른 어려움을 겪고 있습니다. 내 방법이 비동기 적이기 때문에 그럴 수 있습니까? @Anthony – Dannz