Cześć, mam problem z pętlą równoległą i eventami. funkcja TraverseTree to przeszukiwanie iteracyjne katalogów. W pętli równoległej przeszukuje każdy dysk. Zdarzenia wykorzystuję do aktualizowania kontrolki z nazwami plików które zostały już znalezione. Niestety po bardzo krótkiej chwili zużycie CPU maleje do 0 i program zalicza dedlocka Gdy zastosuję zwykłego foreacha to nie ma problemu. jakieś wskazówki ?
List<string> drives = new List<string>() {@"E:\", @"F:\", @"G:\", @"i:\", @"D:\" };
Parallel.ForEach(drives, drive => TraverseTree(drive));
public void TraverseTree(string root)
{
// struktura do przechowywania nazw folderów
Stack<string> dirs = new Stack<string>(20);
if (!System.IO.Directory.Exists(root))
{
return;
}
dirs.Push(root);
while (dirs.Count > 0)
{
string currentDir = dirs.Pop();
string[] subDirs;
try
{
subDirs = System.IO.Directory.GetDirectories(currentDir);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
continue;
}
try
{
List<string> list = new List<string>();
foreach (var item in fileExtensions)
{
string[] files = System.IO.Directory.GetFiles(currentDir, item);
movieFileList.AddRange(files);
list.AddRange(files);
}
onFilesFound(list.ToArray()); //// aktualizacja kontrolki z
}
catch (Exception e)
{
Console.WriteLine(e.Message);
continue;
}
foreach (string str in subDirs)
dirs.Push(str);
}
}
Event
public delegate void FilesFoundEventHandler(object sender, FilesFoundEventArgs e);
public event FilesFoundEventHandler FilesFound;
protected void onFilesFound(string[] filesPaths)
{
if (FilesFound != null)
FilesFound(this, new FilesFoundEventArgs() { NewFilesPaths = filesPaths, NewFilesCount = filesPaths.Length });
}