今天我在 Windows 窗体应用程序中添加了多线程。在我的 UI 线程上,我正在通过 new Thread() {...}).Start(); 它本身将调用一个使用 ThreadPool.QueueUserWorkItem() 的方法。调用方法后,线程将在队列中等待,直到返回特定项目并退出线程:
new Thread(o =>
{
s.SimulateChanges();
Boolean run = true;
while (run)
{
SimulationResult sr = queue.WaitDequeue();
//EOF is a static property which will be returned
//if the queue is at its end so I can break the while loop
if (SimulationResult.EOF.Equals(sr))
{
run = false;
continue;
}
this.simulationProgressBar.BeginInvoke((Action)delegate()
{
if (sr.IsDummy && this.simulationProgressBar.Value < this.simulationProgressBar.Maximum)
{
/*...*/
}
else
{
this.resultListView.AddObject(sr);
}
});
}
this.simulationProgressBar.BeginInvoke((Action)delegate()
{
this.ToggleSimulationControls(true);
});
}).Start();
这就是调用方法的代码:
public void SimulateChanges()
{
ThreadPool.QueueUserWorkItem(o =>
{
foreach (IColElem elem in collection.AsEnumerable())
{
/*lot of code*/
queue.Enqueue(new SimulationResult() { IsDummy = true });
}
log.Debug("Finished!");
queue.Enqueue(SimulationResult.EOF);
});
}
我的队列是一个自写的类,它允许线程等待出队,直到一个对象入队。
一切正常,除了如果我停止调试(使用停止调试或简单地关闭应用程序)我无法重建我的应用程序,因为 VS2010 不会删除文件句柄。我相信这与我的线程没有正确退出有关。他们有什么办法我可以保证吗?
感谢您的任何建议:-)