2016-04-11 13 views
0

私はLAN共有とFTP共有ディレクトリの両方からファイルをダウンロードする方法を書いています。私は複数のベンダーのリストを持っています。私はこれを達成するためにタスクを使用しています。しかし、私はArrayIndexOutofBond Exceptionを取得しています。私のループ状態は正しいですが?マルチタスクc#|配列のインデックスが範囲外になる

ここにコードセグメントがあります。

vendorWiseTasksListening = new List<Task>(); 
        for (int i = 0; i < allVendorIDs.Length; i++) 
        { 
         Task task = new Task(() => FTPMode(allVendorIDs[i])); 
         vendorWiseTasksListening.Add(task); 
         task.Start(); 
         task = new Task(() => SharedMode(allVendorIDs[i])); 
         vendorWiseTasksListening.Add(task); 
         task.Start(); 
        } 
        Task.WaitAll(vendorWiseTasksListening.ToArray()); 

ご協力いただければ幸いです。

+0

あなたの共有オブジェクトがスレッドセーフであるほどスマートにならない限り、スレッドセーフではありません。つまり、複数のスレッドからエラーにアクセスすることになります。 – TomTom

+0

どうすればそれらがスレッドセーフになることを確認できますか? –

+2

SOMEソートのロック。共有オブジェクトを必要としない方法でプログラミングし、最後にコレクションを行います。 LOCKINGは最も簡単です(lockキーワードを読んでください)。最後に、あなたにプログラミングを教えるように頼んでいます。広すぎます。 – TomTom

答えて

1

新しいタスクを作成すると、変数iの値は保存されませんが、すべてのタスクは同じ変数への参照を使用している可能性があります。iこのiは、allVendorIDs.Lengthまでインクリメントされます。

メインスレッドのループが終了した後に、一部のタスクがiの値にアクセスすると、allVendorIDs.Lengthになります。

iのローカルコピーを作成し、あなたのタスクでこれを使用します。

for (int i = 0; i < allVendorIDs.Length; i++) 
       { 
        int j = i; 
        Task task = new Task(() => FTPMode(allVendorIDs[j])); 
        vendorWiseTasksListening.Add(task); 

        task.Start(); 
        task = new Task(() => SharedMode(allVendorIDs[j])); 
        vendorWiseTasksListening.Add(task); 
        task.Start(); 
       } 

は、たとえばthis question for a simpler example and explanationを参照してください。

関連する問題