检查/解决跨线程操作
本文关键字:线程 操作 解决 检查 | 更新日期: 2023-09-27 18:15:50
有一个StatusProgressBar,它经常被线程访问。为了确保这一点,它的Text属性如下:-
[Browsable(true)]
public override string Text
{
get
{
return prg.Text ;
}
set
{
prg.Text = value;
}
}
和prg。Text = value看起来像这样
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; }
然后继续,一切如预期发生,文本改变…为什么第一次不修改文本?
如果您在长时间运行的任务期间从UI线程访问进度条,则进度条将不会刷新,直到长时间运行的任务完成。
您是否尝试在您的CrossThread
方法中执行以下操作?
Application.DoEvents();