在做winform的时候对于跨线程的控件操作都交给委托去做。 如果控件多了就要写很多委托很烦人。
比如说有一个textbox,listview、lable ComboBox等
线程操作的时候有时候是隐藏控件,有时候是获取text有时候是获取Item有时候是修改值。 
一个功能写一个委托好繁琐。有什么简单的或者通用的办法么。。
 Control.CheckForIllegalCrossThreadCalls = false;就不考虑了

解决方案 »

  1.   

    Control.CheckForIllegalCrossThreadCalls = false的弊端是什么?
      

  2.   

    用消息 完成线程间 通信。sendmessage()postmessage()
      

  3.   

    获取或设置一个值,该值指示是否捕获对错误线程的调用,这些调用在调试应用程序时访问控件的 Handle 属性。如果试图访问控件的方法或属性之一的线程不是创建该控件的线程,则通常会导致不可预知的结果。通常,无效的线程活动是对访问控件的 Handle 属性的错误线程的调用。将 CheckForIllegalCrossThreadCalls 设置为 true 可以在调试时更容易查找并诊断此线程活动。请注意在调试器外部启动应用程序时,非法跨线程调用将始终引发异常。MSDN的解释,实际中也遇到过,大多数情况还好,一旦有错误了很难查找出来。
      

  4.   

    印象中System.Action似乎可以解决一些问题!
      

  5.   

    我看看除了用异步委托和用BackgroundWorker组件还有什么好方法学习
      

  6.   

    那就定义个通用委托,里面还不是随便写delegate void X(); // 不用参数版本的通用委托this.Invoke(new X(DoX1));
    this.Invoke(new X(DoX2));void DoX1()
    {
      this.TextBox1.Text=...
      this.TextBox1.Visible=...
      this.Label1.Size=new Size(...)
    }void DoX2()
    {
      this.ComboBox1.Text=...
    }
      

  7.   

    label1 .BeginInvoke  (new MethodInvoker ( delegate (){ label1.Text = i.ToString ();})); 一句话就可以了 ,i.ToString ()换成你要赋的值 
    就这个算是通用写法了,多数能达到线程安全的效果
      

  8.   

    这样也要写好多DoXX方法,和判断InvokeRequired的方法。
      

  9.   


    还没用过这个呢,我去查下MSDN,谢谢了
      

  10.   

    不用判断InvokeRequired了,InvokeRequired=false的时候用委托也不会错
    匿名委托如果语句多了就难写了,因为匿名委托里面是没办法单步跟踪和设置断点的
      

  11.   

                this.Invoke((MethodInvoker)delegate()
                {
                    ///控件调用
                  });