2011-01-19 16 views
1

Parallel.ForEachが正常に動作するのに問題があります。私はrichtextboxにファイルの内容または複数のファイルの内容(各ファイルはログファイルを表す)を読み込むlistviewコントロールを持っています。 Foreachループで作業していたのですが、100以上のファイルをロードするときに並列処理によってロード時間が短縮されることになりました。Parallel.ForEachとListViewコントロール

ここは、foreachループで使用していたコードブロックです。どのようにParallel.Foreachを動かすのですか?

//Set cursor to WaitCursor Style 
this.Cursor = Cursors.WaitCursor; 

//Clear Messages RichTexBox 
this.rtbMessages.Clear(); 

//Loop through each selected file 
foreach (ListViewItem Item in lvMessageFiles.Items) 
{ 
    //Check if item is selected in the listview 
    if (Item.Selected && rtbMessages.TextLength < rtbMessages.MaxLength) 
    { 
     //Get Path to message file 
     filename = String.Format("{0}\\Data\\Log\\{1}.log", Global.AppPath, Item.SubItems[0].Text); 

     //Set Timeline Events calendar to selected items created date 
     cvTimeline.ShowDate(Convert.ToDateTime(lvMessageFiles.SelectedItems[0].SubItems[2].Text)); 

     //Check if file exists 
     if (File.Exists(filename)) 
     { 
      //streamreader to read the file 
      reader = new StreamReader(filename); 

      //to copy the read content in to richtextbox 
      string MessageContents = String.Format("{0}\n{1}\n", ("file:///" + filename.Replace(" ", "%20").Replace("\\", "/")), reader.ReadToEnd()); 
      rtbMessages.Text += MessageContents; 

      // closing streamreader 
      reader.Close(); 
     } 
    } 

} 

//Set cursor to WaitCursor Style 
this.Cursor = Cursors.Default; 

答えて

0

あなたは明らかにParallel.ForEach内のスレッドがされる非UIスレッドからUIを更新するために許可されていません。代わりにInvokeメソッドを使用してTextrtbMessagesに設定し、実行中の問題にはcvTimeline.ShowDate

3

という2つの問題があります。この特定のコードで

1)、あなたは)
2許可されていないバックグラウンドスレッドからUIを変更しようとしているあなたは性能もがI/O」であるだから、このシナリオはとにかく並列化のための良い候補ではありません単一のハードドライブに「バインド」されます。あなたはロード時間を短縮したい場合は、複数のハードドライブにファイルを分割して、並列化が

が、私はこの質問を持つそしてDejaVuを経験していますIs Parallel File.Read Faster than Sequential Read?

+0

良い点...と、すべてのこれらのファイルは、同じドライブにでもフォルダになり、それを並列化するためにあまり意味がありません。各ファイルのないCPU集中処理が存在しないからです。 –

+1

両方とも良い点ですが、Parallel.ForEachでは順序が保証されていないので、すべてのログファイルはいくらかランダムな順序になります – BrokenGlass

0

を参照してください...とにかく、このブログを見てみる価値があるかもしれません記事。私の好みは非常に簡単ですが、達成しようとしていることを正確に実行します。新しい.NET 4並列メカニズムを使用して並行コレクションで作業しながらUIを更新します。しかし、仕事のためにではありません。

http://blogs.msdn.com/b/csharpfaq/archive/2010/06/18/parallel-programming-task-schedulers-and-synchronization-context.aspx

関連する問題