我知道跨线程访问控件需要INVOKE。不过有个疑问,如果我不修改控件的的值只是访问一下控件的属性,是否一样需要INVOKE?比如 这个访问需要吗?if(checkBox.checked == true)
{
}if(checkBox.checked == true)
{
}

解决方案 »

  1.   


    我测试了,没把握因为即使我修改控件的值不用INVOKE也不崩溃不抛出异常。。
      

  2.   

    不用invoke并且没有报错,那是你侥幸,只是访问没有必要
      

  3.   

    我的测试代码:
            private void button1_Click(object sender, EventArgs e)
            {
                Thread t = new Thread(new ThreadStart(CrossThreadCall));
               t.Start();
    }
            public void CrossThreadCall()
            {
                if (textBox1.InvokeRequired)
                {
                    textBox1.Invoke(new MethodInvoker(delegate 
                    { 
                        textBox1.Text = "test";
                        textBox1.Text = "tesx";
                    }
                    ));
                }
                else
                {
                    textBox1.Text = "test";
                }
            }
    我即使把线程里面的 if 部分代码全部注释掉,只执行 textBox1.Text = "test"; 结果不管是DEBUG模式还是RELEASE模式,都不抛出异常
      

  4.   

    居然。读取真的不需要invoke?不知道是不是.net版本不同,有的是需要的。最好还是都加上。什么时候必须要不记得了。反正遇到过。
      

  5.   

    这个比较复杂跨线程操作控件分几种情况。一种是非com的windows标准控件,这种控件对值的修改都有对应的sendmessage来处理,基本上是没有问题的,比如说treeview,textbox,richtextbox等等这些都可以。一种是com类或者自定义控件,自绘窗体之类的。这个是既不能直接引用句柄,也不能用sendmessage来修改。
    如果要修改这一类控件的值,基本上就一个办法,dll注入。这个注入的dll本身要用C++来写。
      

  6.   


    但是如果读也要加的话,代码写起来很头痛。。比如下面这个代码:
    if (checkbox1.checked==true && textbox1.text.Length==10)
    {
       textbox2.text = "test";
    }
    很不好写啊
      
      

  7.   

    个人认为:访问也是需要invoke的
      

  8.   

    同上,设置Control.CheckForIlligateCross.....(后面忘记了)这个属性以后,好像就可以跨线程访问了。