2017-04-14 6 views
1

私は、WebRequestとStreamsで同時に2つのファイルをダウンロードするダウンローダを作ろうとしています。メソッドのコピーで作業を開始する

私は新しいタスクを開始するとき、同じ方法を共有しています。

これは2つのファイルのダウンロードを不可能にします。メソッドのコピーを作成するために新しいタスクまたはスレッドを作成する方法はありますか?

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

のJeroenバンラゲンが述べたように、方法のコピーを作成することはできません。私が試した何

。代わりに、新しいクラスを作成し、メソッドをクラスに入れることができます。次に、複数のクラスインスタンスを作成できます。

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