[C#学习]在多线程中如何调用Winform

作者:unknown  来自:网络


   问题的产生:



   我的WinForm程序中有一个用于更新主窗口的工作线程(worker thread),但文档中却提示我不能在多线程中调用这个form(为什么?),而事实上我在调用时程序常常会崩掉。请问如何从多线程中调用form中的方法呢?



   解答:



   每一个从Control类中派生出来的WinForm类(包括Control类)都是依靠底层Windows消息和一个消息泵循环(message pump loop)来执行的。消息循环都必须有一个相对应的线程,因为发送到一个window的消息实际上只会被发送到创建该window的线程中去。其结果是,即使提供了同步(synchronization),你也无法从多线程中调用这些处理消息的方法。大多数plumbing是掩藏起来的,因为WinForm是用代理(delegate)将消息绑定到事件处理方法中的。WinForm将Windows消息转换为一个基于代理的事件,但你还是必须注意,由于最初消息循环的缘故,只有创建该form的线程才能调用其事件处理方法。如果你在你自己的线程中调用这些方法,则它们会在该线程中处理事件,而不是在指定的线程中进行处理。你可以从任何线程中调用任何不属于消息处理的方法。



   Control类(及其派生类)实现了一个定义在System.ComponentModel命名空间下的接口 -- ISynchronizeInvoke,并以此来处理多线程中调用消息处理方法的问题:




 
        public interface ISynchronizeInvoke

      {

        object Invoke(Delegate method,object[] args);

        IAsyncResult BeginInvoke(Delegate method,object[] args);

        object EndInvoke(IAsyncResult result);

        bool InvokeRequired {get;}

      }

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [C#] 的这些文章也感兴趣:

O/RMapping研究报告(1)
C#网络编程初探(4)
捕捉DataGrid的双击事件(C#版本)
利用VisualC#实现Window管道技术
C#和VB.NET版CLSA.NET 3.0电子图书面市
C#基类应用--字符串处理类
C#2.0新特性探究之模拟泛型和内置算法
c#重点知识详解(三)
使用.NETFramework进行事务处理
谈谈多线程编程(一)- 安全性策略