void changecolor(Color cl)
 {
      this.Invoke(new Action(()=>{                     button2.BackColor = cl;
 
       }));
            
 }

解决方案 »

  1.   

    使用Form的InvokeRequired来判断,并使用Form的Invoke方法调用新建的委托实例
      

  2.   


    可否通俗地说一下
    1, this.Invoke()的意思
    2,new Action()的意思
    3,() =>{语句;}的意思
      

  3.   


    可否通俗地说一下
    1, this.Invoke()的意思
    2,new Action()的意思
    3,() =>{语句;}的意思
    1, this.Invoke()的意思  == 委托方法
    2,new Action()的意思 == 内部定位的委托
    3,() =>{语句;}的意思 这个是Lamada语句 
      

  4.   


    可否通俗地说一下
    1, this.Invoke()的意思
    2,new Action()的意思
    3,() =>{语句;}的意思
    1, this.Invoke()的意思  == 委托方法
    2,new Action()的意思 == 内部定位的委托
    3,() =>{语句;}的意思 这个是Lamada语句 
    委托的意思是不是    “叫别人帮我去做事,而这事的结果是怎么样 我不理”?
      

  5.   


    可否通俗地说一下
    1, this.Invoke()的意思
    2,new Action()的意思
    3,() =>{语句;}的意思
    1, this.Invoke()的意思  == 委托方法
    2,new Action()的意思 == 内部定位的委托
    3,() =>{语句;}的意思 这个是Lamada语句 
    委托的意思是不是    “叫别人帮我去做事,而这事的结果是怎么样 我不理”?
    差不多是这个意思,相当于你 赚到了钱(参数),然后你把这个钱给你儿子花,至于怎么花(里面程序功能实现),你不用管。
      

  6.   

    http://www.cnblogs.com/networkcomms/p/4294003.html
      

  7.   

    //我的目的是:在线程中调用一个函数,函数的功能是把按键参数传进去,然后改变颜色
    public void SetBtnColor(ref Button btn)//这个要可以在线程中被调用
    {
        this.Invoke(new Action(() => { btn.BackColor = Color.Red; }));//但是Lamada又不接收 ref参数 怎么办
    }
      

  8.   

    默认会报错,可以把禁止跨线程访问UI设置为false,这样就不报错了,但这时候你需要自己去判断多线程会不会对UI造成错误影响
      

  9.   

    //我的目的是:在线程中调用一个函数,函数的功能是把按键参数传进去,然后改变颜色
    public void SetBtnColor(ref Button btn)//这个要可以在线程中被调用
    {
        this.Invoke(new Action(() => { btn.BackColor = Color.Red; }));//但是Lamada又不接收 ref参数 怎么办
    }把Ref去掉,直接转对象就可以了。别乱看书,误人
      

  10.   


    1,如何设置 禁止跨线程访问UI为false呢?
    2,线程中访问ui会出现什么样的错误呢?(我的理解是 UI本身有一个线程处理,和自定义UI同时访问同一个资源会出错 但也不会是什么致命错误)
      

  11.   

    c#中多线程访问winform控件的若干问题小结