我有这个进度条类(测试线程)
public class ProgressBarUpdate
{
//Add getters and setters
static MainGUI theForm = (MainGUI)Application.OpenForms[0];
ProgressBar pBarCur = theForm.pBarCur; //Yes, accessing public for now
bool updateCur = false;
bool stopCur = false;
bool showMax = false;
public ProgressBarUpdate()
{
}
public void resetCur()
{
pBarCur.Value = 0;
}
public void DoCurUpdate()
{
while (!stopCur)
{
if (pBarCur.Value < (pBarCur.Maximum / 10) * 9)
pBarCur.PerformStep();
if (showMax)
{
pBarCur.Value = pBarCur.Maximum;
showMax = false;
}
}
}
public void StopCur()
{
stopCur = true;
}
public void UpdateCur()
{
updateCur = true;
}
public void UpdateToMax()
{
showMax = true;
}
然后我在不同的A类中调用所有这些来从那里更新GUI:
ProgressBarUpdate updateBar = new ProgressBarUpdate();
Thread currentProgressUpdater = new Thread(new ThreadStart(updateBar.DoCurUpdate));
try
{
currentProgressUpdater.Start();
currentProgressUpdater.Join();
}
catch (Exception)
{
}
在我运行之后,我得到了我的应用程序停止响应的对话框(马上),然后它要求我关闭。我没有正确实现线程吗?或者我错过了一步?
答案 0 :(得分:3)
您的问题是致电currentProgressUpdater.Join();
。你正在阻止UI线程。
创建新线程的重点是允许UI线程继续处理UI事件。你不是这样做的。启动一个线程然后立即加入它并没有什么不同,只是在线执行代码。
您还可以从新线程中运行的方法访问控件。那不行。 UI控件只能从UI线程访问。
答案 1 :(得分:0)
你在while (!stopCur)
您从未将stopCur
设置为true
。