获取一个值,通过该值指示当调用实现此接口的对象时,调用方是否必须调用 Invoke。(看不懂~~~~) private void SetBtnTxt()
        {
            if (this.InvokeRequired)
            {
                DaiLi d = new DaiLi(SetBtnTxt);
                this.Invoke(d);
                MessageBox.Show("1");
            }
            else
            {
                MessageBox.Show("2");
            }
        }调试的时候先出2再出1,弄不明白啊,哪位大侠用通俗的语言给解释下啊

解决方案 »

  1.   

    简单地说,判断当前的线程是不是该窗体所在的线程,如果不是,需要Invoke到窗体线程去。
      

  2.   

    private void SetBtnTxt() 
            { 
                if (this.InvokeRequired) 
                { 
                    SetBtnTxt(); 
                    this.Invoke(d); 
                    MessageBox.Show("1"); 
                } 
                else 
                { 
                    MessageBox.Show("2"); 
                } 
            } 
    去掉代理呢?
      

  3.   

    this.Invoke(d); 
    哦,invoke后便必须加代理
      

  4.   

    Form 的内部已经规定了不能跨线程调用,并公开了 Invoke 方法。
    你跨线程调用有异常抛出。
    不过,是有一个属性(具体什么忘了)可以设置让 Form 允许你跨线程调用,但是不建议使用。
    Framework 中这种解决线程冲突的方法很舍得学习的。
      

  5.   

    private void SetBtnTxt() 
            { 
                if (this.InvokeRequired)             1   
                { 
                    DaiLi d = new DaiLi(SetBtnTxt);  2
                    this.Invoke(d);                  3
                    MessageBox.Show("1");            5
                } 
                else 
                { 
                    MessageBox.Show("2");            4
                } 
            } 
    单步按这五步执行,大侠给解释下啊
      

  6.   

      Control.CheckForIllegalCrossThreadCalls = false;
    大侠应该说的是这个方法,禁用了会出问题,所以用上边那个方法搞异步,但是不明白原理啊,写不下去啦
      

  7.   

    你这个例子写得不好,建议你上MSDN再找些例子看看如果你是在别的线程调用,确切的顺序应该是(我用你上面的序号)
    1,2,3,1,4,5
      

  8.   

    按照正常逻辑的写法:private void SetBtnTxt()
    {
        if (this.InvokeRequired)
        {
            DaiLi d = new DaiLi(SetBtnTxt);
            this.Invoke(d);
        }
        else
        {
            // to do
        }
      

  9.   

    1,2,3,1,4,5是这个顺序,我略了下,不明白那部的意思,就给略了,哈哈
    还有SetBtnTxt() 
    不是在主线程上
    在Thread thrd = new Thread(new ThreadStart(SetBtnTxt));上边
      

  10.   

    例如,你原来的方法是这样的:        private void SetBtnTxt()
            {
                btn.Text = "Test";
            }因为上面的方法是不支持跨线程使用,那么如果你要让他线程安全,那就需要这样改:
            private void SetBtnTxt()
            {
                if (this.InvokeRequired)
                {
                    DaiLi d = new DaiLi(SetBtnTxt);
                    this.Invoke(d);
                }
                else
                {
                    btn.Text = "Test";
                }
            }
      

  11.   

    对啊
    我用这个东西主要用在窗体加载太慢,出现了假死现象,所以我就把Load里的给控件赋值的函数啥的都写在了另一个线程里,Control.CheckForIllegalCrossThreadCalls = false;用这个给屏蔽了一下错误,结果有的控件不支持多线程的操作,显示不出来
    所以就上网搜到了上边的方法,已经像大侠那样写了,在else里做的Todo
    但是效果不是很好,还是卡,所以想知道
    12345每一步是干啥的,再研究下
    这段方法的实质是啥啊
      

  12.   

    this.InvokeRequired
    什么情况下为True,什么情况下位false
    生成当前窗口(this)的主线程运行的时候为True?