C#多线程通信之委托(事件)


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

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

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

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

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

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

MyThread.cs

  1. using System;  
  2. using System.Threading;  
  3.   
  4. namespace ThreadsComm  
  5. {  
  6.     public delegate void ReadParamEventHandler(string sParam);  
  7.     class MyThread  
  8.     {  
  9.         public Thread thread1;  
  10.         private static ReadParamEventHandler OnReadParamEvent;  
  11.         public MyThread()  
  12.         {  
  13.             thread1 = new Thread(new ThreadStart(MyRead));  
  14.             thread1.IsBackground = true;  
  15.             thread1.Start();  
  16.         }  
  17.         public event ReadParamEventHandler ReadParam  
  18.         {  
  19.             add { OnReadParamEvent += new ReadParamEventHandler(value);}  
  20.             remove{ OnReadParamEvent -= new ReadParamEventHandler(value);}  
  21.         }  
  22.         protected void MyRead()  
  23.         {  
  24.             int i = 0;  
  25.             while (true)  
  26.             {  
  27.                 Thread.Sleep(1000);  
  28.                 i = i + 1;  
  29.                 OnReadParamEvent(i.ToString());//触发事件   
  30.             }  
  31.         }  
  32.     }  
  33. }  
其中的
  1. public event ReadParamEventHandler ReadParam  
  2.        {  
  3.            add { OnReadParamEvent += new ReadParamEventHandler(value);}  
  4.            remove{ OnReadParamEvent -= new ReadParamEventHandler(value);}  
  5.        }  

这个需要说明一下:

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

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

  • 1
  • 2
  • 下一页

相关内容