国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

winform+BackgroundWorker 多線程下如何停止和暫停

2019-11-11 02:13:57
字體:
供稿:網(wǎng)友

本文主要記錄如何利用winform,BackgroundWorker線程控件和PRogressBar進度控件進行開發(fā)(這樣啟用工作線程和UI主線程,可以讓進度條能進行更新,避免UI假死),同時支持啟用多個后臺BackgroundWorker,以及支持統(tǒng)一的全局進度條更新,同時支持暫停和停止任務(wù)。

下面是定義BackgroundWorker各種事件:

BackgroundWorker  Bworker = new BackgroundWorker();                 Bworker.WorkerReportsProgress = true;Bworker.DoWork += new DoWorkEventHandler(worker_DoWork);Bworker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);Bworker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);Bworker.RunWorkerAsync();

在work_DoWork中調(diào)用具體執(zhí)行的方法,worker_ProgressChanged方法用來實時更新進度條值,worker_RunWorkerCompleted方法用來處理當(dāng)后臺線程執(zhí)行完操作后要處理的事情,如更新界面UI進度條等。

剛開始的時候是沒有取消按鈕的,現(xiàn)在看看怎么加上取消按鈕。

BackgroundWorker 是支持取消事件的,主要通過一個button_click事件,調(diào)用Bworker .CancelAsync(),然后在worker_DoWork中檢測是否已經(jīng)取消了:

//檢測是否被取消了if (worker.CancellationPending) {    e.Cancel = true;    break; }

       有了取消,就想起了也需要加上暫停,暫停的功能需要自己實現(xiàn)。其實就是利用ManualResetEvent 允許線程通過發(fā)信號互相通信的特點,

1.設(shè)定一個全局的變量,  public static ManualResetEvent mre = new ManualResetEvent(false);ManualResetEvent建立時是把false作為start的初始狀態(tài),這個類用于通知另一個線程,讓它等待一個或多個線程。

2.增加一個暫停Pause_Click事件,如果是暫定,則調(diào)用 mre.Reset();//暫停當(dāng)前線程的工作,發(fā)信號給waitOne方法,阻塞。

   如果是繼續(xù),則 mre.Set();//繼續(xù)某個線程的工作,

   worker_DoWork中檢測mre.WaitOne();這樣就完成了簡單的暫??刂?。

     上面還是用單個線程處理事務(wù),速度很慢,CPU,內(nèi)存,IO都沒有充分的利用起來,所以下面就想到了啟用多線程,充分利用系統(tǒng)資源。

      那么問題來了,如何結(jié)合BackgroundWorker使用多線程呢,后來發(fā)現(xiàn)其實一個簡單的做法,就是啟用多個BackgroundWorker來啟動業(yè)務(wù),當(dāng)然,對應(yīng)的ManualResetEvent也需要有多個。(啟用多個BackgroundWorker唯一要注意的是更新全局變量進度的時候,需要針對進度進行加鎖)

 private List<ManualResetEvent> lstManualResets = null; private BackgroundWorker Bworker = null; private static readonly object objLock = new object();
   for (int i = 0; i < nThreadNum; i++)            {                Bworker = new BackgroundWorker();                Bworker.WorkerSupportsCancellation = true;                Bworker.WorkerReportsProgress = true;                Bworker.DoWork += new DoWorkEventHandler(worker_DoWork);                Bworker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);                Bworker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);                lstBworkers.Add(Bworker);                lstManualResets.Add(new ManualResetEvent(true));                Bworker.RunWorkerAsync(i);            }

一個臨時轉(zhuǎn)換工具的開發(fā)過程,記錄下來,如上有什么更好建議或想法,也請大家多多指點。


上一篇:poj1016


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 汉川市| 吴忠市| 阿克苏市| 蕲春县| 班玛县| 阿拉尔市| 霍邱县| 肃南| 阳江市| 河津市| 江门市| 丽江市| 额敏县| 五原县| 兴和县| 西安市| 海丰县| 宜君县| 伊春市| 长武县| 鹤壁市| 阿克| 新乐市| 喜德县| 西丰县| 上思县| 兴义市| 禄丰县| 库尔勒市| 莎车县| 垦利县| 昭觉县| 新安县| 长沙县| 福清市| 隆德县| 阿克陶县| 肃北| 绍兴市| 辉县市| 逊克县|