在研究C# 線程之間通信時,發現傳統的方法大概有三種
①全局變量,由於同一進程下的多個進程之間共享數據空間,所以使用全局變量是最簡單的方法,但要記住使用volatile進行限制。
②線程之間發送消息(這個隨後文章中會討論到)。
③ CEvent為MFC中的一個對象,可以通過對CEvent的觸發狀態進行改變,從而實現線程間的通信和同步,這個主要是實現線程直接同步的一種方法。
本文介紹的一種方法是這三種之外的一種方法,本文中實例是通過創建一個線程類,通過委托事件把值傳送到Form所在的類中,同時更新Form類中的一個控件(Label)中的值。
實現功能比較簡單,目的是實現此功能,先把代碼貼上:
MyThread.cs
- using System;
- using System.Threading;
-
- namespace ThreadsComm
- {
- public delegate void ReadParamEventHandler(string sParam);
- class MyThread
- {
- public Thread thread1;
- private static ReadParamEventHandler OnReadParamEvent;
- public MyThread()
- {
- thread1 = new Thread(new ThreadStart(MyRead));
- thread1.IsBackground = true;
- thread1.Start();
- }
- public event ReadParamEventHandler ReadParam
- {
- add { OnReadParamEvent += new ReadParamEventHandler(value);}
- remove{ OnReadParamEvent -= new ReadParamEventHandler(value);}
- }
- protected void MyRead()
- {
- int i = 0;
- while (true)
- {
- Thread.Sleep(1000);
- i = i + 1;
- OnReadParamEvent(i.ToString());//觸發事件
- }
- }
- }
- }
其中的
- public event ReadParamEventHandler ReadParam
- {
- add { OnReadParamEvent += new ReadParamEventHandler(value);}
- remove{ OnReadParamEvent -= new ReadParamEventHandler(value);}
- }
這個需要說明一下:
add 上下文關鍵字用於定義一個自定義事件訪問器,當客戶端代碼訂閱您的事件時將調用該訪問器。 如果提供自定義 add 訪問器,還必須提供 remove 訪問器。
remove 上下文關鍵字用於定義一個自定義事件訪問器,當客戶端代碼取消訂閱事件時將調用該訪問器。 如果提供自定義 remove 訪問器,還必須提供 add 訪問器。