有一个StatusProgressBar,通常可以从线程访问。为确保这一点,其Text属性如下: -
[Browsable(true)]
public override string Text
{
get
{
return prg.Text ;
}
set
{
prg.Text = value;
}
}
prg.Text =值看起来像这样
public override string Text
{
get
{
return base.Text;
}
set
{
Misc.CrossThread(this , delegate
{
base.Text = value;
}, true);
}
public static void CrossThread(Control control, MethodInvoker d, bool forceSynchronous)
{
if (control.InvokeRequired)
{
if (forceSynchronous)
{
control.Invoke((Action)delegate { CrossThread(control, d, forceSynchronous); });
}
else
{
control.BeginInvoke((Action)delegate { CrossThread(control, d, forceSynchronous); });
}
}
else
{
if (control.IsDisposed)
{
throw new ObjectDisposedException("Control is already disposed.");
}
d();
}
}
现在问题是,当从UI线程(有时)访问它时,文本不会改变.. 离。
if (cbGateway.SelectedIndex == -1)
{ bp.Text = "Select GATEWAY"; return; }
这里'bp'指的是StatusProgressBar
对象。
现在,如果我在
处设置断点{ bp.Text = "Select GATEWAY"; return; }
然后继续,一切都按预期发生,文本更改.. 为什么第一次不改变文本?
答案 0 :(得分:1)
如果在长时间运行的任务期间从UI线程访问进度条,则在长时间运行的任务完成之前,不会刷新进度条。
答案 1 :(得分:0)
您是否尝试在CrossThread
方法中执行the following?
Application.DoEvents();