源动力

程序在于积累和思考
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

从非启动线程访问控件的两种方法

Posted on 2012-03-19 11:36  老K的幸福生活  阅读(222)  评论(0编辑  收藏  举报

从非启动线程访问控件会出现错误:线程间操作无效: 从不是创建控件“”的线程访问它。
目前常用的解决方法有如下两种:

方法一:
Control.CheckForIllegalCrossThreadCalls = false;

这种方法只是作为保留方法,一般不用。
方法二:
用委托,每个控件都有个InvokeRequired的属性,判断一下是不是true,是的话进行Invoke操作。

  //建立委托
private delegate string ReturnStrDelegate();

private string GetNamel()
{
     return txtName.Text.Trim();

}

//判断一下是不是该用Invoke,不是就直接返回

private string ReturnName(ReturnStrDelegate del)
{
     if (txtName.InvokeRequired)
     {
           return (string)txtName.Invoke(del);
     }
     else
     {
          return del();
     }
}

//调用
string _name = ReturnName(GetName);

===============================================

void Server_DataReponse(Message msg)
{
       if (this.InvokeRequired)
       {
            this.BeginInvoke(new DataReponse(Server_DataReponse), new object[] { msg });
       }
       else
       {
             this.txtInfo.AppendText("收到信息" + msg.ToString());
             this.txtInfo.ScrollToCaret();
      }
}