【发布时间】:2013-04-07 18:04:25
【问题描述】:
今天我在一个 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 不会删除文件句柄。我相信这与我的线程没有正确退出有关。他们有什么办法可以保证吗?
感谢您的建议 :-)
【问题讨论】:
-
你得到什么错误?正在使用哪个文件?
-
我的项目的输出程序集:错误:进程无法访问该文件,因为它正在被另一个进程使用。如果我尝试删除文件或清理解决方案,则会出现同样的错误。
-
删除创建线程的代码后错误是否消失?
-
更重要的是,您在任务管理器中看到您的应用程序的进程了吗?它真的在运行吗?
标签: multithreading winforms visual-studio-2010