【发布时间】:2013-05-16 15:02:42
【问题描述】:
我有这个进度条类(测试线程)
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)
{
}
在我运行它之后,我会看到我的应用程序停止响应的对话框(立即),然后它要求我关闭。我没有正确实现线程吗?还是我错过了一步?
【问题讨论】:
-
如果您不想使用 BackgroundWorker(),请让您的 ProgressBarUpdate() 类引发自定义
events以传递进度。主窗体会在创建 ProgressBarUpdate() 实例时订阅这些事件,然后在这些事件到来时根据接收到的信息更新其控件。确保正确使用委托和 Invoke() 来更新 GUI 以避免跨线程异常。
标签: c# multithreading progress-bar