特定のディレクトリとそのサブディレクトリのファイルで特定の文字列を見つけるために parallel.foreach を使用するプログラムを作成しようとしています。反復の約 90% で正常に動作しますが、その後プログラムがハングし、実行されません。なんでも。
private void searchParallel()
{
directories.Clear();
lbResults.Items.Clear();
if (cbDirectory.Text.Length != 0)
{
getAllDirectories(cbDirectory.Text);
pbSearchProgress.Maximum = directories.Count;
pbSearchProgress.Minimum = 0;
pbSearchProgress.Value = 0;
//foreach (String dir in directories)
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 10;
Parallel.ForEach(directories,options, (dir) =>
{
try
{
//MessageBox.Show(dir.ToString());
String[] files = Directory.GetFiles(dir);
foreach (String file in files)
{
//MessageBox.Show(file.ToString());
if (checkFilePermission(file))
{
StreamReader reader = new StreamReader(file);
//MessageBox.Show(file);
int lineCount = 0;
while (reader.Peek() != -1)
{
Application.DoEvents();
String line = reader.ReadLine();
lineCount++;
if (line.ToLower().Contains(txtSearch.Text.ToLower()))
{
updateList(file, lineCount);
}
if (isSearching == false)
{
}
}
}
//if (isSearching == false)
//{
// break;
//}
}
pbMakeProgress();
//if (isSearching == false)
//{
// loopState.Stop();
//}
//MessageBox.Show("Search Completed.");
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
});
}
}
private void updateList(String file, int lineCount)
{
if (lbResults.InvokeRequired)
{
listDelegate lstDelegate = new listDelegate(updateList);
lbResults.Invoke(lstDelegate, new object[] { file, lineCount });
}
else
{
lbResults.Items.Add("Found in " + file + " at line: " + lineCount);
}
}
private void pbMakeProgress()
{
if (pbSearchProgress.InvokeRequired)
{
pbSearchProgress.Invoke(new MethodInvoker(pbMakeProgress));
}
else
{
pbSearchProgress.Value++;
}
}
pbMakeProgress はプログレス バーの値を更新し、updateList はリスト ボックスを更新します。getAllDirectories はサブディレクトリを取得します。directorys は、トラバースされるすべてのフォルダの名前を含むリストです。