Je rencontre un problème pour que Parallel.ForEach fonctionne correctement. J'ai un contrôle listview qui charge un contenu de fichiers ou le contenu de plusieurs fichiers (chaque fichier représente un fichier journal) dans une riche zone de texte. Si tout avait fonctionné avec une boucle Foreach, il a décidé que l'opération parallèle réduirait le temps de chargement lors du chargement de plus de 100 fichiers.Parallel.ForEach et contrôle ListView
Voici le bloc de code que j'utilisais pour la boucle foreach. Comment puis-je faire fonctionner un 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;
bon point ... et puisque tous ces fichiers seront sur le même lecteur, le dossier même, et il n'y a pas de traitement de cpu-intensive de chaque fichier qu'il ne fait pas beaucoup de sens à paralléliser. –
les deux bons points, aussi la commande n'est pas garantie dans Parallel.ForEach donc tous les fichiers de log seront dans un ordre quelque peu aléatoire – BrokenGlass