多线程中对其他线程中创建的控件进行操作
在WinForm中有很多的控件不是线程安全的,如果在子线程中设置在主线程中创建的控件的属性。在运行时就可能会出现异常。因此在子线程中要设置主线程中创建的控件的属性,不能直接对属性进行赋值。
.NET Framework中对每个控件都提供了Invoke和BeginInvoke方法用来完成在其他线程中对控件进行操作的功能。
Invoke与BeginInvoke的区别是:Invoke提供同步操作,而BeginInvoke提供异步操作。
具体使用方法如下(以Invoke为例):
这个方法主要是将设置控件的属性操作通过调用自定义方法来实现,而自定义方法定义成一个委托作为参数传递给Invoke方法。调用方式:Control.Invoke (new Delegate(costomMethod),object[]{parameters}).在调用这个方法时,在控件内部会调用costomMethod方法并且以parameters作为参数。而在costomMethod方法中真正对控件的属性赋值。
Step 1:声明一个委托,委托的签名与通过Invoke调用的自定义方法的签名一致。
Step 2:设计一个自定义方法,然后在方法体内对控件进行操作。
Step 3:在线程中需要对控件进行操作的地方作如下调用:
Control.Invoke (new Delegate(costomMethod),object[]{parameters})
属性值可以作为parameter传递。
个人见解:
为什么要这样来实现?
我觉得这样实现的原因是多线程对控件进行操作有可能会造成控件的状态或数据不一致。通过Invoke的实现方法,.Net framework可以对控件的具体操作过程加以控制(将线程间的同步过程加以封装)。不过是否真的如此本人还没有进行证实过。