В моем приложении я проверяю свои файлы открытым процессом Wireshark перед добавлением в свой список. это Добавить событие Каталог щелчка, которые укореняются папку и проверяя все эти файлы в этой папке и вложенных папок:Подождите, пока мой BackgroundWorker не закончит, чтобы открыть новый BackgroundWorker
private void btnAddDir_Click(object sender, EventArgs e)
{
try
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
ThreadStart threadStart = delegate
{
foreach (string file in SafeFileEnumerator.EnumerateFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories))
{
Interlocked.Increment(ref numWorkers);
StartBackgroundFileChecker(file);
}
};
Thread thread = new Thread(threadStart);
thread.IsBackground = true;
thread.Start();
}
}
catch (Exception)
{ }
}
private void StartBackgroundFileChecker(string file)
{
ListboxFile listboxFile = new ListboxFile();
listboxFile.OnFileAddEvent += listboxFile_OnFileAddEvent;
BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork +=
(s3, e3) =>
{
//check my file
};
backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;
backgroundWorker.RunWorkerAsync();
}
void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (Interlocked.Decrement(ref numWorkers) == 0)
{
//update my UI
}
}
Когда я проверить этот файл я открыт Wireshark
процесс, так что если я выбрать папку с большим количеством файлов, многие Wireshark
обрабатываются, и это занимает много места в памяти, как я могу подождать, пока мой BackgroundWorker не закончится, и только потом открыть новый?
Довольно уверен, что уже прокомментировал этот код. Точно такой же совет, переместите петлю foreach внутри рабочего, так что вам понадобится только один BGW. Ожидание потоков - это всегда плохая идея, ваш код будет заторможен. –