2013-01-17 3 views
5

ちょっとしたアドバイス 私は100.000+ xmlファイルを処理して別のシステムに移動しました。ParallelForeachを使用したファイルの処理。これは最善のアプローチです

public void ProcessFiles() 
    { 
     IEnumerable<FileInfo> orderedFiles = GetFilesOrdered(); 

     foreach (FileInfo file in orderedFiles) 
     { 
      ProcessFile(file); 
     } 
    } 

私はタスク並列ライブラリについて読んでそれ自信を持っていないされています:

コンセプト

は、私のようなループを持っている非常に単純です。 スレッディングにはそれほど糊付けされていません。 TPLは私のためにたくさんのものを包み込んでいるようです。

単純に言えば、パラレルを使用する場合です。

任意のサンプルや提案

+0

こんにちは、スレッドの安全性のために、これらのファイルに同時にアクセスできないようにしてください。 –

+0

@ Joe.wangありがとうございますロックを追加することですか?もしあなたがスニペットを私に提供できないのであれば、あなたの時間に感謝してください。 – user9969

+0

'index'変数は何ですか?あなたはそれを使用していないようです。 – Bridge

答えて

0

はい、それはParallel.ForEachforeachを交換するのと同じくらい簡単かもしれません。

複数のスレッドが同時にProcessFileを実行していることを覚えておく必要があります。

したがって、そのメソッドの共有状態に書き込む場合は、同期構造を使用してそのメソッドを保護する必要があります。

あなたはマルチスレッドに新しいしている場合、あなたはここで読むべき偉大な入門電子ブックがあります:Albahari

+4

もうひとつ考えてみましょう:IOが現在ボトルネックでない場合は、並列化を追加するだけです。 –

+0

@NicholasButlerどのように並列ライブラリで競合状態を回避するのですか?あなたはロックを使用しますか? – user9969

+0

@ user231465それは大きな話題です。私はジョーアルバハリの電子ブックを読むことをお勧めします。並行コードを正しく記述する場合は、その中のすべてを理解する必要があります。 –

0

は、それはあなたに役立つことを願います。ファイルを並行して移動する方法をデモンストレーションする簡単なスニペット。

 List<FileInfo> files = new List<FileInfo>(); 
     files.Add(new FileInfo("F:\\1.xml")); 
     files.Add(new FileInfo("F:\\2.xml")); 
     files.Add(new FileInfo("F:\\3.xml")); 



     Parallel.ForEach(files, f => 
     { 
      f.MoveTo("d:\\test\\" + f.Name); 
     }); 
関連する問題