【发布时间】:2013-05-28 10:35:17
【问题描述】:
在我的应用程序中,我通过打开 Wireshark 进程检查我的文件,然后再添加到我的列表框。 这是添加目录单击事件,它获取根文件夹并检查此文件夹和子文件夹中的所有文件:
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 循环移到 worker 内部,这样你就只需要一个 BGW。等待线程总是一个坏主意,你的代码会死锁。