怎么在c#中利用委托事件实现多线程通信

  介绍

本篇文章为大家展示了怎么在c#中利用委托事件实现多线程通信,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

在研究c#线程之间通信时,发现传统的方法大概有三种:

<李>

全局变量,由于同一进程下的多个进程之间共享数据空间,所以使用全局变量是最简单的方法,但要记住使用不稳定进行限制。

<李>

线程之间发送消息(这个随后文章中会讨论到)。

<李>

, CEvent为MFC中的一个对象,可以通过对CEvent的触发状态进行改变,从而实现线程间的通信和同步,这个主要是实现线程直接同步的一种方法。

本文介绍的一种方法是这三种之外的一种方法,本文中实例是通过创建一个线程类,通过委托事件把值传送到形式所在的类中,同时更新形式类中的一个控件(标签)中的值。

实现功能比较简单,目的是实现此功能,先把代码贴上:

MyThread。cs

using 系统;   using  System.Threading;   ,   namespace  ThreadsComm   {   ,public  delegate  void  ReadParamEventHandler (string  sParam);   class  MyThread   ,{   public 才能;Thread  thread1;   private 才能static  ReadParamEventHandler  OnReadParamEvent;   public 才能;MyThread ()   {才能   ,,thread1 =, new 线程(new  ThreadStart (MyRead));   ,,thread1.IsBackground =,真的;   ,,thread1.Start ();   ,,}   public 才能;event  ReadParamEventHandler  ReadParam   {才能   ,,add  {+=,, OnReadParamEvent  new  ReadParamEventHandler(价值);}   ,才能消除{,OnReadParamEvent  -=, new  ReadParamEventHandler(价值);}   ,,}   protected 才能;void  MyRead ()   {才能   ,,int 小姐:=,0;   ,,while (真正的)   ,,{   ,,,thread . sleep (1000);   ,,,小姐:=,小姐:+,1;   ,,,OnReadParamEvent (i.ToString());//触发事件   ,,}   ,,}   ,}   }

其中的

public  event  ReadParamEventHandler  ReadParam   {才能   ,,add  {+=,, OnReadParamEvent  new  ReadParamEventHandler(价值);}   ,才能消除{,OnReadParamEvent  -=, new  ReadParamEventHandler(价值);}   以前,,}

这个需要说明一下:

<强> add  上下文关键字用于定义一个自定义事件访问器,当客户端代码订阅您的事件时将调用该访问器只如果提供自定义,add 访问器,还必须提供,remove 访问器。

<强> remove  上下文关键字用于定义一个自定义事件访问器,当客户端代码取消订阅事件时将调用该访问器只如果提供自定义,remove 访问器,还必须提供,add 访问器。
的形式。cs

using 系统;   using  System.Windows.Forms;   ,   namespace  ThreadsComm   {   ,public  partial  class  Form1 :形式   ,{   private 才能static  string  param =,““   public 才能Form1 ()   {才能   ,,InitializeComponent ();   ,,MyThread  thread1 =, new  MyThread ();   ,,thread1.ReadParam  +=, this.OnRead;   ,,}   ,   private 才能;void  OnRead (string  sParam)   {才能   ,,param =, sParam;   ,,对象[],list =, {,, System.EventArgs.Empty};   ,,this.lblShow.BeginInvoke (new  EventHandler (LabelShow),列表);   ,,}   protected 才能;void  LabelShow (o, Object  EventArgs  e)   {才能   ,,this.lblShow.Text =,参数;   ,,}   ,}   }

其中的

, MyThread  thread1 =, new  MyThread ();   +=,thread1.ReadParam  this.OnRead;

是订阅线程类中的事件。

, this.lblShow.BeginInvoke (new  EventHandler (LabelShow),列表),

调用或者,BeginInvoke方法都需要一个委托对象作为参数。委托类似于回调函数的地址,因此调用者通过这两个方法就可以把需要调用的函数地址封送给界面线程。这些方法里面如果包含了更改控件状态的代码,那么由于最终执行这个方法的是界面线程,从而避免了竞争条件,避免了不可预料的问题。如果其它线程直接操作界面线程所属的控件,那么将会产生竞争条件,造成不可预料的结果。

使用,调用完成一个委托方法的封送,就类似于使用,SendMessage方法来给界面线程发送消息,是一个同步方法。也就是说在,调用封送的方法被执行完毕前,,调用方法不会返回,从而调用者线程将被阻塞。

怎么在c#中利用委托事件实现多线程通信