日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实现一个多线程循环的类

發布時間:2025/3/21 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现一个多线程循环的类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?只要重寫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?

????????
///?<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);
????
}

總結

以上是生活随笔為你收集整理的实现一个多线程循环的类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。