实现一个多线程循环的类
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                实现一个多线程循环的类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                ?只要重寫protected abstract void DealEvent()即可,這個方法實現多線程的內容,如果內容是循環的,不必在寫循環語句, private void CycleDealEvent()方法已經實現了。
??
/**////功能:用一個單獨的線程進行處理的基類
//作者:wangjian?
//時間:2007-9-20
/**////
using?System;
using?System.Threading;
namespace?GDS.ThreadDealEvent
...{
????/**////?<summary>
????///?ThreadBase?的摘要說明
????///?</summary>???
????public?abstract?class?DealEventThreadBase:IDisposable
????...{
????????
????????//線程處理運行,安全停止標志
????????private?bool?_dealEventRunFlag?=?false;
????????//強行停止前安全停止等待的時間,單位為妙,默認值為20;
????????private?uint?_stopSpan?=?20;
????????//是否循環執行DealEvent()
????????private?bool?_cycleDeal?=?true;
????????
????????private?Thread?_dealEventThread;
????????/**////?<summary>
????????///?強行停止前安全停止等待的時間,單位為妙,默認值為20;
????????///?</summary>
????????protected?uint?StopSpan
????????...{
????????????get
????????????...{
????????????????return?_stopSpan;
????????????}
????????????set
????????????...{
????????????????if?(_stopSpan?<?1)
????????????????...{
????????????????????throw?new?Exception("StopSpan的值要求大于0");
????????????????}
????????????????_stopSpan?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?指示是否循環執行DealEvent()
????????///?</summary>
????????public?bool?CycleDeal
????????...{
????????????get
????????????...{
????????????????return?_cycleDeal;
????????????}
????????}
????????/**////?<summary>
????????///?線程處理運行,安全停止標志
????????///?</summary>
????????public?bool?DealEventRunFlag
????????...{
????????????get
????????????...{
????????????????return?_dealEventRunFlag;
????????????}
????????????set
????????????...{
????????????????_dealEventRunFlag?=?value;
????????????}
????????}
????????/**////?<summary>
????????///?處理,由子類重寫
????????///?</summary>
????????protected?abstract?void?DealEvent();
????????/**////?<summary>
????????///?循環處理
????????///?</summary>
????????private?void?CycleDealEvent()
????????...{
????????????????do
????????????????...{
????????????????????if?(!_dealEventRunFlag)
????????????????????????break;
????????????????????try
????????????????????...{
????????????????????????DealEvent();
????????????????????}
????????????????????catch?(Exception?ex)
????????????????????...{
????????????????????????if?(ExceptionEvent?!=?null)
????????????????????????...{
????????????????????????????ExceptionEvent(ex);
????????????????????????}
????????????????????}
????????????????}?while?(_cycleDeal);??
????????}
????????/**////?<summary>
????????///?開始線程,如果現存存在則先終止再開始
????????///?</summary>
????????public?virtual?void?StartDealEventThread()
????????...{
????????????StartDealEventThread(true);????????
????????}
????????/**////?<summary>
????????///?開始線程,如果現存存在則先終止再開始
????????///?</summary>
????????///?<param?name="cycleDeal">true:循環執行DealEvent();false:執行一次DealEvent()</param>
????????public?virtual?void?StartDealEventThread(bool?cycleDeal)
????????...{
????????????if?(_dealEventThread?!=?null?&&?(_dealEventThread.ThreadState?==?ThreadState.Running?||?_dealEventThread.ThreadState?==?ThreadState.WaitSleepJoin))
????????????...{
????????????????return;
????????????}
????????????//確保已經停止
????????????//StopDealEventThread();
????????????else
????????????...{
????????????????_cycleDeal?=?cycleDeal;
????????????????_dealEventRunFlag?=?true;
????????????????_dealEventThread?=?new?Thread(new?ThreadStart(CycleDealEvent));
????????????????_dealEventThread.Start();
????????????}
????????}
????????/**////?<summary>
????????///?終止線程,如果在20秒內不能按期停止,則強行停止
????????///?</summary>
????????public?virtual?void?StopDealEventThread()
????????...{
????????????if?(_dealEventThread?==?null?||?_dealEventThread.ThreadState?==?ThreadState.Aborted?||?_dealEventThread.ThreadState?==ThreadState.AbortRequested?||_dealEventThread.ThreadState?==?ThreadState.Stopped?||_dealEventThread.ThreadState?==?ThreadState.Unstarted?||_dealEventThread.ThreadState?==?ThreadState.StopRequested)
????????????...{
????????????????return;
????????????}
????????????_dealEventRunFlag?=?false;
????????????try
????????????...{
????????????????float?ThreadAbortFlag?=?0;
????????????????while?(_dealEventThread.ThreadState?!=?ThreadState.Stopped&&_dealEventThread.ThreadState!=ThreadState.Aborted)
????????????????...{
????????????????????OnStopDealEvent(new?ProgressEventArgs(ThreadAbortFlag?/?_stopSpan*2));
????????????????????Thread.Sleep(500);
????????????????????ThreadAbortFlag++;
????????????????????if?(ThreadAbortFlag?>?_stopSpan*2)
????????????????????...{
????????????????????????//如果_stopThreadFlag無法停止線程,則等待500*_stopSpan*20毫秒后用Abort()結束
????????????????????????_dealEventThread.Abort();???????????????????????
????????????????????????break;
????????????????????}
????????????????}
????????????????
????????????}
????????????catch
????????????...{?}??????????
????????}
????????/**////?<summary>
????????///?終止線程,如果在StopSpan秒內不能按期停止,則強行停止
????????///?</summary>
???????///?<param?name="StopSpan">安全終止的時間,單位:秒</param>
????????public?virtual?void?StopDealEventThread(uint?stopSpan)
????????...{
????????????uint?span?=?stopSpan?*?2;
????????????if?(_dealEventThread?==?null?||?_dealEventThread.ThreadState?==?ThreadState.Aborted?||?_dealEventThread.ThreadState?==?ThreadState.AbortRequested?||?_dealEventThread.ThreadState?==?ThreadState.Stopped?||?_dealEventThread.ThreadState?==?ThreadState.Unstarted?||?_dealEventThread.ThreadState?==?ThreadState.StopRequested)
????????????...{
????????????????return;
????????????}
????????????_dealEventRunFlag?=?false;
????????????try
????????????...{
????????????????float?ThreadAbortFlag?=?0;
????????????????while?(_dealEventThread.ThreadState?!=?ThreadState.Stopped?&&?_dealEventThread.ThreadState?!=?ThreadState.Aborted)
????????????????...{
????????????????????OnStopDealEvent(new?ProgressEventArgs(ThreadAbortFlag?/?span));
????????????????????Thread.Sleep(500);
????????????????????ThreadAbortFlag++;
????????????????????if?(ThreadAbortFlag?>?span)
????????????????????...{
????????????????????????//如果_stopThreadFlag無法停止線程,則等待500×span毫秒后用Abort()結束
????????????????????????_dealEventThread.Abort();
????????????????????????break;
????????????????????}
????????????????}
????????????}
????????????catch
????????????...{?}
????????}
????????/**////?<summary>
????????///?線程狀態
????????///?</summary>
????????public?ThreadState?DealEventThreadState
????????...{
????????????get
????????????...{
????????????????try
????????????????...{
????????????????????return?_dealEventThread.ThreadState;
????????????????}
????????????????catch
????????????????...{
????????????????????return?ThreadState.Unstarted;
????????????????}
????????????}
????????}
????????IDisposable#region?IDisposable
????????private?bool?_disposed?=?false;
????????protected?virtual?void?Dispose(bool?disposing)
????????...{
????????????if?(this._disposed)
????????????????return;
????????????if?(disposing)
????????????...{
???????????????StopDealEventThread();??????????????
????????????}????????????????
????????????
????????????_disposed?=?true;
????????}
????????public?void?Dispose()
????????...{
????????????Dispose(true);
????????}
????????~DealEventThreadBase()
????????...{
????????????Dispose(false);
????????}
????????#endregion?
????????/**////?<summary>
????????///?停止進程的進度事件,
????????///?</summary>
????????public?event?StopDealEventEventHandler?StopDealEvent;
????????public?event?TempEventHandler?ExceptionEvent;
????????/**////?<summary>
????????///?觸發進度事件
????????///?</summary>
????????///?<param?name="e"></param>
????????protected?virtual?void?OnStopDealEvent(ProgressEventArgs?e)
????????...{
????????????if?(StopDealEvent?!=?null)
????????????...{
????????????????StopDealEvent(this,?e);
????????????}
????????}
????????
????}
????/**////?<summary>
????///?進度事件參數
????///?</summary>
????public?class?ProgressEventArgs?:?EventArgs
????...{
????????private?float?progress;
????????public?float?Progress
????????...{
????????????get?...{?return?progress;?}
????????}
????????/**////?<summary>
????????///?進度事件參數
????????///?</summary>
????????///?<param?name="progress">進度值,大于等于0,小于等于1</param>
????????public?ProgressEventArgs(float?progress)
????????...{
????????????if?(progress?<?0?||?progress?>?1)
????????????...{
????????????????throw?new?Exception("進度值應大于等于0,小于等于1");
????????????}
????????????this.progress?=?progress;????????????
????????}
????}
????/**////?<summary>
????///?停止進程的進度委托
????///?</summary>
????///?<param?name="sender"></param>
????///?<param?name="e"></param>
????public?delegate?void?StopDealEventEventHandler(object?sender,?ProgressEventArgs?e);???
?
????public?delegate?void?TempEventHandler(Exception?ex);
????
}
總結
以上是生活随笔為你收集整理的实现一个多线程循环的类的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: C#中EventLog的使用
- 下一篇: rss_test
