我有一个带有自定义进度条的自定义表单,在主类(主线程)中生成。然后我生成一个线程并向其发送 ThreadStart 函数。此线程启动函数应该更新自定义控件中的进度条,但没有:
class MyClass
{
......
//Custom form with progress bar
public CustomFormWithProgressBar statusScreen = new CustomFormWithProgressBar(0);
//thread to use
private Thread myThread;
.....
//Linked to a button to trigger the update procedure.
void ButtonPressEvent(.......)
{
//create a sub thread to run the work and handle the UI updates to the progress bar
myThread = new Thread(new ThreadStart(ThreadFunction));
myThread.Start();
}
.....
//The function that gets called when the thread runs
public void ThreadFunction()
{
//MyThreadClass myThreadClassObject = new MyThreadClass(this);
//myThreadClassObject.Run();
statusScreen.ShowStatusScreen();
for (int i = 0; i < 100; i++ )
{
statusScreen .SetProgressPercentage(i);
Thread.Sleep(20);
}
statusScreen.CloseStatusScreen();
}
现在我的 statusScreen 表单只是坐着,什么也不做。没有更新发生。但我已经确认子线程确实已创建,当我在 ThreadFunction 中时,我正在新线程上运行。通过 Visual Studio 中的线程窗口确定这一点。
为什么我对状态屏幕的进度百分比的更新没有显示?我如何获取更新以将新值推送到进度屏幕并使其实时显示?
请注意,发送到状态屏幕功能的整数值代表完成的百分比。 Thread.Sleep 只是为了在发生时查看更新。
请注意,这不是重新绘制问题。当进度百分比传递到自定义进度栏时,我调用 Invalidate
您无法从另一个线程更新控件。
正确的方法 - 是根据您的目的使用BackgroundWorker。
另一种方法(几乎是正确的方法) - 使用 Control.Invoke 方法。
还有另一种几乎正确的方法 - 使用 SynchronizationContext。
但是您可以选择权力的阴暗面并使用 CheckForIllegalCrossThreadCalls - Control 类的静态属性并将其设置为 false。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)