检查/解决交叉线程操作

时间:2011-11-28 07:50:06

标签: c# multithreading

有一个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; }

然后继续,一切都按预期发生,文本更改.. 为什么第一次不改变文本?

2 个答案:

答案 0 :(得分:1)

如果在长时间运行的任务期间从UI线程访问进度条,则在长时间运行的任务完成之前,不会刷新进度条。

答案 1 :(得分:0)

您是否尝试在CrossThread方法中执行the following

Application.DoEvents();