检查/解决跨线程操作

本文关键字:线程 操作 解决 检查 | 更新日期: 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();