C# 线程访问winform控件的方法

在winform外调用winform控件的方法很多,比如delegate、Action、Func等方法异步调用,但是C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它。
Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性 。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。

具体用线程访问winform控件的方法,如下:

首先定义一个委托,与这个事件处理函数的签名一样委托,当然直接使用该事件的委托也是可以的,如:

 private   delegate   void  InvokeCallback( string  msg);

//然后就是判断这个属性的值来决定是否要调用Invoke函数:

 void  m_comm_MessageEvent( string  msg)

    {

     if (txtMessage.InvokeRequired)

     {

      InvokeCallbackmsgCallback  =   new  InvokeCallback(m_comm_MessageEvent);

      txtMessage.Invoke(msgCallback,  new   object []  { msg } );

    } 

     else 

     {

      txtMessage.Text  =  msg;

    } 

   }

说明:这个函数就是事件处理函数,txtMessage是一个文本框。

这样就做到了窗体中控件的线程安全性。
简单的说,如果有两个线程,Thread A和Thread B,并且有一个Control c,是在Thread A里面new的。

那么在Thread A里面运行的任何方法调用c.InvokeRequired都会返回false。

相反,如果在Thread B里面运行的任何方法调用c.InvokeRequired都会返回true。

猜你喜欢

转载自blog.csdn.net/amesteur/article/details/80279871