多線程

 Net66編寫

一、引言
     在編寫Windows form時,如果直接在UI線程要運行一個費時方法的話(如從數據庫查詢大量數據時),會引起程序“假死”,從而導致用戶不滿。這個時候就需要通過多線程技術來解決,提高界面交互性能,方便用戶使用。
一般通過三種方式解決:
1.通過System.Threading.Thread類,創建新的線程,Thread.Start運行費時方法。
2.通過System.Threading.ThreadPool類,將費時任務提交到線程池中,等待運行。
以上兩種方法,基本思路是在UI界面中控制線程的啓動和中止,在線程中回調用UI界面方法,更新界面。在線程中回調UI界面方法時,特別是涉及更新控件屬性時,如果不注意,存在很大的隱患。這兩種辦法,編碼和控制結構較爲複雜,需要啓動和管理額外的線程佔用資源。
3.通過異步委託調用,將該方法排隊到系統線程池的線程中運行,而在費時方法中也通過Control.BeginInvoke異步回調,達到"啓動後不管"的目的。
這種方法,編碼簡單,程序結構較爲清晰,充分利用.NET框架的異步委託功能,但要對異步調用知識較熟悉。
相關知識點參見
     現利用.NET異步委託調用功能,編寫Task抽象類,以方便管理後臺工作線程,銜接後臺線程與UI線程的聯繫。該抽象類提供了調用和管理的框架,沒有方法的實現細節,通過繼承類、重寫方法,可以實現想要的功能。主要功能如下:
1.利用異步委託調用,實際多線程,不需要單獨後臺線程。
2.通過委託、事件驅動,實際後臺與前臺UI線程的聯繫,實現事件廣播。
3.支持正常取消後臺工作方法(費時方法)運行,也可以強制中止線程。
4.能夠捕獲取消、強制中止和方法出錯三種情況,並突發相關事件,以便進行釋放資源等操作。
5.通過異步調用,在工作方法中安全調用涉及UI控件的方法。
6.自行管理工作進程狀態,提供狀態變化事件。
7.只要工作方法調用簽名,符合定義的TaskDelegate委託接口,可通過StartTask(TaskDelegate worker ,params object[] args )方便調用。在實際使用時,可在繼承類中定義多個相同調用接口的方法,避免重複編碼,較爲方便。

給大家作個參考,而大牛呢,多點指正。當是扔個磚頭,想砸塊玉吧。


二、代碼

  1using System;
  2using System.Windows.Forms;
  3
  4namespace Net66.AsynchThread
  5{
  6    /// <summary>
  7    /// 任務工作狀態
  8    /// </summary>

  9    public enum TaskStatus 
 10     
 37
 38    /// <summary>
 39    /// 任務狀態消息
 40    /// </summary>

 41    public class TaskEventArgs : EventArgs 
 42         
137
138    /// <summary>
139    /// 任務的工作方法(Work)的委託接口
140    /// 傳入值:對象數組(object[])
141    /// 返回值:對象(object)
142    /// </summary>

143    public delegate object TaskDelegate( params object[] args ); 
144
145    /// <summary>
146    /// 任務事件的委託接口
147    /// </summary>

148    public delegate void TaskEventHandler( object sender, TaskEventArgs e ); 
149
150    abstract public class Task
151    {   
152        內部屬性
178
179        事件
201
202        屬性
267
268        觸發事件
358
359        工作進程管理
497
498        工作方法的基礎
520    }

521}

522
523使用Task類
636



三、示例
1.啓動時的UI界面


2.後臺工作方法(費用方法)運行後,任務狀態爲Running


3.強制中止工作方法,運行任務狀態Aborted


4.工作方法突發錯誤時,任務狀態ThrowErrorStoped


5.工作方法正常結束或正常取消而結束時,任務狀態Stopped


示例代碼下載

 

 

發佈了69 篇原創文章 · 獲贊 4 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章