厚積薄發(fā)爆侣,豐富的公用類庫積累萍程,助你高效進(jìn)行系統(tǒng)開發(fā)(11)---各種線程相關(guān)操作類

俗話說,一個好漢十個幫兔仰,眾人拾柴火焰高等都說明一個道理茫负,有更多的資源,更豐富的積累乎赴,都是助你走向成功忍法,走向頂峰的推動力。

本篇的公用類庫的介紹主題是程序開發(fā)中多線程操作環(huán)境中榕吼,常用到的線程相關(guān)類饿序,本篇隨筆介紹包含單件創(chuàng)建輔助類、Timer定時器友题、委托處理輔助類、隊(duì)列的線程處理服務(wù)輔助類戴质、可以取消執(zhí)行操作的線程池輔助類度宦、線程池輔助類踢匣、線程輔助類等對象,這些輔助類覆蓋了多線程開發(fā)中絕大多數(shù)的應(yīng)用戈抄。良好的封裝及操作离唬,給我們提供非常方便、高效的線程操作處理划鸽。

本篇繼續(xù)繼續(xù)整理優(yōu)化已有的共用類庫输莺,并繼續(xù)發(fā)表隨筆介紹公用類庫的接口方法以及詳細(xì)使用操作,力求給自己繼續(xù)優(yōu)化裸诽,積攢更豐富的公用類庫資源嫂用,加深了解的同時,也給大家展現(xiàn)公用類庫好的方面丈冬。

**1嘱函、單件操作輔助類 Singleton。 **
實(shí)現(xiàn)效果

  1. 本輔助類主要是用來方便實(shí)現(xiàn)類對象的單件實(shí)例操作埂蕊,減少重復(fù)寫單件實(shí)現(xiàn)代碼的繁瑣往弓,簡化類的代碼。
    2)創(chuàng)建一個類對象的單件實(shí)例蓄氧,類對象的構(gòu)造函數(shù)不能為Public修飾符的函似,一般為private。

實(shí)現(xiàn)代碼
1)輔助類提供的方法源碼如下所示:

/// <summary>    
/// 創(chuàng)建一個類對象的單件實(shí)例喉童,類對象的構(gòu)造函數(shù)不能為Public修飾符的撇寞,一般為private。    
/// </summary>    
/// <typeparam name="T">待創(chuàng)建的對象類</typeparam>
public static class Singleton<T> where T : class   
{    
    static volatile T _instance;    
    static object _lock = new object();    
   
    static Singleton()    
    {    
    }    
   
    /// <summary>    
    /// 創(chuàng)建/獲取一個可以new的類對象的單件實(shí)例    
    /// </summary>
    public static T Instance    
    {    
        get   
        {    
            if (_instance == null)    
                lock (_lock)    
                {    
                    if (_instance == null)    
                    {    
                        ConstructorInfo constructor = null;    
   
                        try   
                        {    
                            // 構(gòu)造函數(shù)不包含public修飾符的    
                            constructor = typeof(T).GetConstructor(BindingFlags.Instance |    
                                          BindingFlags.NonPublic, null, new Type[0], null);    
                        }    
                        catch (Exception exception)    
                        {    
                            throw new InvalidOperationException(exception.Message, exception);    
                        }    
   
                        if (constructor == null || constructor.IsAssembly)    
                        {    
                            throw new InvalidOperationException(string.Format("在'{0}'里面沒有找到private或者protected的構(gòu)造函數(shù)泄朴。", typeof(T).Name));    
                        }    
   
                        _instance = (T)constructor.Invoke(null);    
                    }    
                }    
   
            return _instance;    
        }    
    }  

2)輔助類Singleton的使用例子代碼如下所示

/// <summary>    
/// 單件測試類    
/// </summary>
public class TestSingletonClass    
{    
    /// <summary>    
    /// 私有構(gòu)造函數(shù)    
    /// </summary>
    private TestSingletonClass()    
    {    
    }    
   
    public void ShowMessage()    
    {    
        MessageUtil.ShowTips("單件實(shí)例測試函數(shù)");    
    }    
}    
   
private void btnSingleton_Click(object sender, EventArgs e)    
{    
    //單件輔助類使用代碼    
    Singleton<TestSingletonClass>.Instance.ShowMessage();    
}

如果沒有使用單件輔助類重抖,那么單件的測試類將會需要這樣書寫,很明顯多了很多行代碼祖灰,如果每個想單件處理的類都要這樣寫钟沛,代碼量還是很可觀的,而且比較繁瑣局扶。

/// <summary>    
/// 單件測試類    
/// </summary>
public class TestSingletonClass    
{    
    private static TestSingletonClass m_Instance;    
   
    /// <summary>    
    /// 單件實(shí)例    
    /// </summary>
    public static TestSingletonClass Instance    
    {    
        get   
        {    
            if (m_Instance == null)    
            {    
                m_Instance = new TestSingletonClass();    
            }    
            return m_Instance;    
        }    
    }    
   
    /// <summary>    
    /// 私有構(gòu)造函數(shù)    
    /// </summary>
    private TestSingletonClass()    
    {    
    }    
   
    public void ShowMessage()    
    {    
        MessageUtil.ShowTips("單件實(shí)例測試函數(shù)");    
    }    
}  

**2恨统、定期執(zhí)行某些任務(wù)的定時器輔助類Timer。 **
實(shí)現(xiàn)效果

  1. 本輔助類主要是用來方便實(shí)現(xiàn)定時器輔助類三妈,功能和另外一個定時器輔助類TimerHelper差不多畜埋。
    2) 定時器操作,都通過對象鎖以及在運(yùn)行處理事件的時候畴蒲,動態(tài)改變間隔事件為無限等待悠鞍,處理完成后修改為間隔時間的方式,實(shí)現(xiàn)對定時器的正常模燥、安全執(zhí)行咖祭,不會發(fā)生運(yùn)行一半又跳到下一個的處理過程中掩宜。
    3).NET提供了3種定時器實(shí)現(xiàn),他們的特點(diǎn)如下所示么翰。該Timer輔助類是基于Threading.Timer的定時器實(shí)現(xiàn)牺汤。

實(shí)現(xiàn)代碼

1)輔助類提供的方法接口如下所示:

#region 事件或?qū)傩?   
   
/// <summary>    
/// 按定時器周期定期引發(fā)的事件    
/// </summary>
public event EventHandler Elapsed;    
   
/// <summary>    
/// 定時器任務(wù)間隔(毫秒)    
/// </summary>
public int Period { get; set; }    
   
/// <summary>    
/// 指示是否在方法開始的時候,啟動定時器Elapsed事件一次浩嫌。默認(rèn)為false檐迟。    
/// </summary>
public bool RunOnStart { get; set; }   
  
#endregion   
  
#region 構(gòu)造函數(shù)    
   
/// <summary>    
/// 創(chuàng)建一個定時器    
/// </summary>    
/// <param name="period">定時器間隔 (毫秒)</param>
public Timer(int period)    : this(period, false)    
   
/// <summary>    
/// 創(chuàng)建一個定時器    
/// </summary>    
/// <param name="period">定時器間隔 (毫秒)</param>    
/// <param name="runOnStart">指示是否在方法開始的時候,啟動定時器Elapsed事件一次</param>
public Timer(int period, bool runOnStart)   
  
#endregion   
  
#region 方法    
   
/// <summary>    
/// 啟動定時器    
/// </summary>
public void Start()    
   
/// <summary>    
/// 停止定時器    
/// </summary>
public void Stop()    
   
/// <summary>    
/// 等待定時器停止    
/// </summary>
public void WaitToStop()   
  
  
#endregion  

2)輔助類Timer 的使用例子代碼如下所示

private void btnTimer_Click(object sender, EventArgs e)    
{    
    WHC.OrderWater.Commons.Threading.Timer timer = new WHC.OrderWater.Commons.Threading.Timer(1000, true);    
    timer.Elapsed += new EventHandler(timer_Elapsed);    
    timer.Start();    
}    
   
void timer_Elapsed(object sender, EventArgs e)    
{    
    if (!this.InvokeRequired)    
        return;    
   
    this.Invoke(new MethodInvoker(delegate()    
    {    
        this.btnTimer.Text = DateTime.Now.ToLongTimeString();    
    }));    
}  

3码耐、定時器輔助類TimerHelper追迟,可指定運(yùn)行間隔、延遲啟動時間等操作伐坏。

實(shí)現(xiàn)效果

  1. 本輔助類主要是用來方便實(shí)現(xiàn)定時器輔助類怔匣,可指定運(yùn)行間隔、延遲啟動時間等操作桦沉。功能和另外一個定時器輔助類Timer差不多每瞒。

2)定時器操作,都通過對象鎖以及在運(yùn)行處理事件的時候纯露,動態(tài)改變間隔事件為無限等待剿骨,處理完成后修改為間隔時間的方式,實(shí)現(xiàn)對定時器的正常埠褪、安全執(zhí)行浓利,不會發(fā)生運(yùn)行一半又跳到下一個的處理過程中。

實(shí)現(xiàn)代碼

1)輔助類提供的方法接口如下所示:

/// <summary>    
/// 定時器執(zhí)行操作的函數(shù)原型    
/// </summary>
public delegate void TimerExecution();    
   
/// <summary>    
/// 定時器執(zhí)行時調(diào)用的操作    
/// </summary>
public event TimerExecution Execute;    
   
/// <summary>    
/// 創(chuàng)建一個指定時間間隔的定時器钞速,并在指定的延遲后開始啟動贷掖。(默認(rèn)間隔為100毫秒)    
/// </summary>
public TimerHelper()    
   
/// <summary>    
/// 創(chuàng)建一個指定時間間隔的定時器,并在指定的延遲后開始啟動渴语。    
/// </summary>    
/// <param name="interval">定時器執(zhí)行操作的間隔時間(毫秒)</param>    
/// <param name="startDelay">指定的延遲時間(毫秒)</param>
public TimerHelper(long interval, int startDelay)    
   
/// <summary>    
/// 創(chuàng)建一個指定時間間隔的定時器    
/// </summary>    
/// <param name="interval">定時器執(zhí)行操作的間隔時間(毫秒)</param>    
/// <param name="start">是否啟動</param>
public TimerHelper(long interval, bool start)    
   
/// <summary>    
/// 啟動定時器并指定延遲時間(毫秒)    
/// </summary>    
/// <param name="delayBeforeStart">指定延遲時間(毫秒)</param>
public void Start(int delayBeforeStart)    
   
/// <summary>    
/// 立即啟動定時器    
/// </summary>
public void Start()    
   
/// <summary>    
/// 暫停定時器    
/// 注意:運(yùn)行中的線程不會被停止    
/// </summary>
public void Pause()    
   
/// <summary>    
/// 停止定時器    
/// 注意:運(yùn)行中的線程不會被停止    
/// </summary>
public void Stop()    
   
/// <summary>    
/// 定時器的處理時間    
/// </summary>    
/// <param name="obj"></param>
public void Tick(object obj)    
   
/// <summary>    
/// 定時器的狀態(tài)    
/// </summary>
public TimerState State    
   
/// <summary>    
/// 獲取或設(shè)置定時器的運(yùn)行間隔    
/// </summary>
public long Interval  

2)輔助類TimerHelper的使用例子代碼如下所示

public FrmNewHouse()    
    {    
        InitializeComponent();    
   
        if (!this.DesignMode)    
        {    
            this.winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged);    
            this.winGridViewPager1.OnStartExport += new EventHandler(winGridViewPager1_OnStartExport);    
            this.winGridViewPager1.OnRefresh += new EventHandler(winGridViewPager1_OnRefresh);    
            this.winGridViewPager1.OnGridViewMouseDoubleClick += new EventHandler(winGridViewPager1_OnGridViewMouseDoubleClick);    
            this.winGridViewPager1.ShowLineNumber = true;    
            this.winGridViewPager1.PagerInfo.PageSize = 20;    
            this.winGridViewPager1.BestFitColumnWith = true;    
            this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1;    
            this.winGridViewPager1.gridView1.RowCellStyle += new DevExpress.XtraGrid.Views.Grid.RowCellStyleEventHandler(gridView1_RowCellStyle);    
   
            //使用定時器苹威,定時刷新窗體的數(shù)據(jù),并提示客戶更新情況    
            int interval = Portal.gc.GetRefreshSecond();//獲取定時間隔時間    
            TimerHelper timer = new TimerHelper(interval, true);    
            timer.Execute += new TimerHelper.TimerExecution(timer_Execute);    
        }    
    }    
        
    //通過Invoke來實(shí)現(xiàn)跨線程間的調(diào)用    
    void timer_Execute()    
    {    
        if (!this.InvokeRequired)    
            return;    
   
        this.Invoke(new MethodInvoker(delegate()    
        {    
            NotifyNewHouse();    
        }));    
    }  

4驾凶、提供一個隊(duì)列的線程處理服務(wù)輔助類 QueueServer牙甫。

實(shí)現(xiàn)效果

  1. 本輔助類主要是用來方便實(shí)現(xiàn)提供一個隊(duì)列的線程處理服務(wù)操作。QueueServer是一個先入先出(FIFO)的隊(duì)列處理服務(wù)调违。

實(shí)現(xiàn)代碼

1)輔助類提供的方法接口如下所示:

#region  屬性方法    
   
/// <summary>    
/// 是否是背景線程    
/// </summary>
public bool IsBackground    
   
/// <summary>    
/// 執(zhí)行隊(duì)列    
/// </summary>
public T[] Items    
   
/// <summary>    
/// 隊(duì)列數(shù)量    
/// </summary>
public int QueueCount    
   
/// <summary>    
/// 將對象加到隊(duì)列結(jié)尾    
/// </summary>    
/// <param name="item"></param>
public void EnqueueItem(T item)    
   
/// <summary>    
/// 清除隊(duì)列    
/// </summary>
public void ClearItems()   
  
#endregion   
  
#region 線程處理    
   
/// <summary>    
/// 處理單個元素    
/// </summary>    
/// <param name="item">元素項(xiàng)目</param>
protected virtual void OnProcessItem(T item)    
   
/// <summary>    
/// 處理函數(shù)    
/// </summary>
public event Action<T> ProcessItem;   
  
#endregion 

2)輔助類QueueServer的使用例子代碼如下所示

 private void btnQueneServer_Click(object sender, EventArgs e)    
    {    
        QueueServer<PreDataInfo> queueServer = new QueueServer<PreDataInfo>();    
        queueServer.IsBackground = true;    
        queueServer.ProcessItem += new Action<PreDataInfo>(queueServer_ProcessItem);    
   
        //循環(huán)入隊(duì)    
        for (int i = 0; i < 100; i++)    
        {    
            queueServer.EnqueueItem(new PreDataInfo(i.ToString(), DateTime.Now.ToString()));    
            Thread.Sleep(10);    
        }    
    }    
   
    /// <summary>    
    /// 處理每個出隊(duì)的操作    
    /// </summary>
    void queueServer_ProcessItem(PreDataInfo obj)    
    {    
        Console.WriteLine("{0} : {1}", obj.Key, obj.Data);    
    }    
}    
   
public class PreDataInfo    
{    
    public string Key;    
    public string Data;    
   
    public PreDataInfo()    
    {    
    }    
   
    public PreDataInfo(string key, string data)    
    {    
        this.Key = key;    
        this.Data = data;    
    }    
}  

5窟哺、可以取消執(zhí)行操作的線程池輔助類 AbortableThreadPool。

實(shí)現(xiàn)效果

  1. 本輔助類主要是用來方便實(shí)現(xiàn)可以取消執(zhí)行操作的線程池操作技肩。

2)AbortableThreadPool線程輔助類可以使用常用的多線程處理環(huán)境中且轨,也可以使用在有些在運(yùn)行過程中可能需要取消的線程處理環(huán)境中。

實(shí)現(xiàn)代碼

1)輔助類提供的方法接口如下所示:

 /// <summary>        
 /// 把執(zhí)行操作放到隊(duì)列中。當(dāng)線程池的線程可用的時候旋奢,方法執(zhí)行阿蝶。        
 /// </summary>        
 /// <param name="callback">一個代表將要執(zhí)行方法的WaitCallback對象</param>
 public static WorkItem QueueUserWorkItem(WaitCallback callback)        
         
 /// <summary>        
 /// 把執(zhí)行操作放到隊(duì)列中,并指定了一個對象黄绩,它包含將要執(zhí)行方法的數(shù)據(jù)。        
 /// 當(dāng)線程池的線程可用的時候玷过,方法執(zhí)行爽丹。        
 /// </summary>        
 /// <param name="callback">一個代表將要執(zhí)行方法的WaitCallback對象</param>        
 /// <param name="state">一個對象,它包含將要執(zhí)行方法的數(shù)據(jù)</param>
 public static WorkItem QueueUserWorkItem(WaitCallback callback, object state)        
       
 /// <summary>        
 /// 取消指定的隊(duì)列中的工作項(xiàng)辛蚊。        
 /// </summary>        
 /// <param name="item">線程池中取消的項(xiàng)目</param>        
 /// <param name="allowAbort">如果設(shè)置為<see langword="true"/>則允許終止線程</param>        
 /// <returns>項(xiàng)目隊(duì)列的狀態(tài)</returns>
 public static WorkItemStatus Cancel(WorkItem item, bool allowAbort)        
       
 /// <summary>        
 /// 獲取指定隊(duì)列中工作項(xiàng)的狀態(tài)        
 /// </summary>        
 /// <param name="item">線程池中工作項(xiàng)</param>        
 /// <returns>工作項(xiàng)的狀態(tài)</returns>
 public static WorkItemStatus GetStatus(WorkItem item)      
   
      /// <summary>    
      /// 取消所有任務(wù)    
      /// </summary>    
      /// <param name="allowAbort">線程是否終止</param>
      public static void CancelAll(bool allowAbort)    
   
      /// <summary>    
      /// 類似Thread.Join,等待AbortableThreadPool執(zhí)行完成    
      /// </summary>
      public static void Join()    
   
      /// <summary>    
      /// 類似Thread.Join,等待AbortableThreadPool執(zhí)行完成    
      /// </summary>    
      /// <param name="millisecondsTimeout">等待的毫秒數(shù)</param>    
      /// <returns></returns>
      public static  bool Join(int millisecondsTimeout)    
   
      /// <summary>    
      /// 類似Thread.Join,等待AbortableThreadPool執(zhí)行完成    
      /// </summary>    
      /// <param name="timeout">等待的時間范圍</param>    
      /// <returns></returns>
      public static bool Join(TimeSpan timeout)    
   
      /// <summary>    
      /// 在隊(duì)列中粤蝎,還未執(zhí)行處理的數(shù)量    
      /// </summary>
      public static int QueueCount    
   
      /// <summary>    
      /// 在執(zhí)行中的線程數(shù)量    
      /// </summary>
      public static int WorkingCount  

2)輔助類AbortableThreadPool的使用例子代碼如下所示

private void btnAbortableThreadPool_Click(object sender, EventArgs e)    
{    
    Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));    
        
    WorkItem workItem1 = AbortableThreadPool.QueueUserWorkItem(new WaitCallback(Test));    
    Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));    
        
    WorkItem workItem2 = AbortableThreadPool.QueueUserWorkItem(new WaitCallback(Test));    
    WorkItem workItem3 = AbortableThreadPool.QueueUserWorkItem(new WaitCallback(Test));    
    WorkItem workItem4 = AbortableThreadPool.QueueUserWorkItem(new WaitCallback(Test));    
    WorkItem workItem5 = AbortableThreadPool.QueueUserWorkItem(new WaitCallback(Test));    
    Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));    
    Thread.Sleep(1000);    
        
    Console.WriteLine(AbortableThreadPool.Cancel(workItem1, false));    
    Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));    
    Thread.Sleep(1000);    
        
    Console.WriteLine(AbortableThreadPool.Cancel(workItem1, true));    
    Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));    
    Thread.Sleep(1000);    
        
    //AbortableThreadPool.CancelAll(true);//可取消所有任務(wù)    
    AbortableThreadPool.Join(); //等待所有任務(wù)退出    
    Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));    
}    
   
static void Test(object state)    
{    
    int i = 100;    
    while (i-- > 0)    
    {    
        Console.WriteLine(i);    
        Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(100));    
    }    
}  

6、委托處理輔助類DelegateHelper袋马。

實(shí)現(xiàn)效果

  1. 本輔助類主要是用來方便實(shí)現(xiàn)委托的處理初澎。

2)使用委托處理輔助類DelegateHelper,可以快速執(zhí)行或者取消一些委托方法的執(zhí)行虑凛。

實(shí)現(xiàn)代碼

1)輔助類提供的方法接口如下所示:

/// <summary>    
/// 執(zhí)行委托操作    
/// </summary>    
/// <param name="target">目標(biāo)委托對象</param>    
/// <param name="args">參數(shù)</param>
public static WorkItem InvokeDelegate(Delegate target, params object[] args)    
   
/// <summary>    
/// 執(zhí)行委托操作    
/// </summary>    
/// <param name="target">目標(biāo)委托對象</param>
public static WorkItem InvokeDelegate(Delegate target)    
   
/// <summary>    
/// 中止指定的隊(duì)列中委托    
/// </summary>    
/// <param name="target">目標(biāo)委托對象</param>    
/// <returns>項(xiàng)目隊(duì)列中止操作的狀態(tài)</returns>
public static WorkItemStatus AbortDelegate(WorkItem target)  

2)輔助類DelegateHelper的使用例子代碼如下所示

private void btnDelegeteHelper_Click(object sender, EventArgs e)    
{    
    //無參數(shù)的委托    
    DelegateHelper.InvokeDelegate(new UpdateTextDelegate(this.UpdateText));     
   
    //有參數(shù)的委托    
    DelegateHelper.InvokeDelegate(new UpdateTextDelegate2(this.UpdateText), 100);    
   
}    
private delegate void UpdateTextDelegate();    
private delegate void UpdateTextDelegate2(int count);    
private void UpdateText()    
{    
    for (int i = 0; i < 1000; i++)    
    {    
        Thread.Sleep(100);    
    }    
}    
private void UpdateText(int count)    
{    
    for (int i = 0; i < count; i++)    
    {    
        Thread.Sleep(100);    
    }    
}  

7碑宴、線程池輔助操作類 ThreadPoolHelper。

實(shí)現(xiàn)效果

  1. 本輔助類主要是用來方便實(shí)現(xiàn)線程池輔助操作桑谍。延柠。

實(shí)現(xiàn)代碼

1)輔助類提供的方法接口如下所示:

/// <summary>    
/// 方法委托    
/// </summary>
public delegate void WaitCallbackNew();    
   
/// <summary>    
/// 把執(zhí)行方法放到隊(duì)列中。    
/// 當(dāng)線程池線程變?yōu)榭捎玫臅r候锣披,方法執(zhí)行贞间。    
/// </summary>    
/// <param name="callback">委托對象</param>
public static bool QueueUserWorkItem(WaitCallbackNew callback)    
   
/// <summary>    
/// 把執(zhí)行方法放到隊(duì)列中。    
/// 當(dāng)線程池線程變?yōu)榭捎玫臅r候雹仿,方法執(zhí)行增热。    
/// </summary>    
/// <param name="proc">委托對象數(shù)組</param>    
/// <returns></returns>
public static bool QueueUserWorkItems(params WaitCallbackNew[] proc)    
   
/// <summary>    
///等待指定數(shù)組中所有元素收到信號    
/// </summary>
public static bool WaitAll()    
   
/// <summary>    
///等待指定數(shù)組中任何一個元素收到信號    
/// </summary>    
/// <returns>滿足等待的對象數(shù)組索引</returns>
public static int WaitAny()  

2)輔助類ThreadPoolHelper的使用例子代碼如下所示

private void UpdateText()    
{    
    for (int i = 0; i < 50; i++)    
    {    
        Thread.Sleep(100);    
    }    
}    
   
private void btnThreadPool_Click(object sender, EventArgs e)    
{    
    ThreadPoolHelper.QueueUserWorkItem(new ThreadPoolHelper.WaitCallbackNew(UpdateText));    
    ThreadPoolHelper.WaitAny();   //阻塞主界面線程,到5秒循環(huán)結(jié)束后胧辽,主界面可以操作 
}  

8峻仇、線程操作輔助類ThreadHelper。

實(shí)現(xiàn)效果

  1. 本輔助類主要是用來方便實(shí)現(xiàn)線程的各種操作票顾,包括設(shè)置線程名稱础浮、優(yōu)先級等及把執(zhí)行方法放到隊(duì)列中執(zhí)行等基礎(chǔ)性的線程操作。

實(shí)現(xiàn)代碼

1)輔助類提供的方法接口如下所示:

/// <summary>    
/// 線程名稱奠骄,最長不超過10個字符豆同!    
/// </summary>    
/// <param name="name">線程名稱</param>
public static void SetThreadName(string name)    
   
/// <summary>    
/// 設(shè)置線程優(yōu)先級    
/// </summary>    
/// <param name="priority">線程優(yōu)先級</param>
public static void SetThreadPriority(ThreadPriority priority)    
   
/// <summary>    
/// 設(shè)置主線程的UI Culture    
/// </summary>    
/// <param name="cultureName"></param>
public static void SetMainThreadUICulture(string cultureName)    
   
/// <summary>    
/// 把執(zhí)行方法放到隊(duì)列中,并指定了一個對象含鳞,它包含使用該方法的數(shù)據(jù)影锈。    
/// 當(dāng)線程池線程變?yōu)榭捎玫臅r候,方法執(zhí)行。    
/// </summary>    
/// <param name="callBack">工作項(xiàng)(WaitCallback)對象</param>    
/// <param name="threadName">線程名稱鸭廷,最長不超過10個字符枣抱!</param>    
/// <param name="priority">線程優(yōu)先級</param>
public static bool Queue(WaitCallback callBack, string threadName, ThreadPriority priority)    
   
/// <summary>    
/// 把執(zhí)行方法放到隊(duì)列中,并指定了一個對象辆床,它包含使用該方法的數(shù)據(jù)佳晶。    
/// 當(dāng)線程池線程變?yōu)榭捎玫臅r候,方法執(zhí)行讼载。    
/// </summary>    
/// <param name="callBack">工作項(xiàng)(WaitCallback)對象</param>    
/// <param name="threadName">線程名稱轿秧,最長不超過10個字符!</param>    
/// <param name="state">執(zhí)行方法的數(shù)據(jù)</param>    
/// <param name="priority">線程優(yōu)先級</param>
public static bool Queue(WaitCallback callBack, string threadName, object state, ThreadPriority priority)    
   
/// <summary>    
/// 線程休眠一段毫秒時間    
/// </summary>    
/// <param name="millisecondsTimeout">一段毫秒時間</param>
public static void Sleep(int millisecondsTimeout)    
   
/// <summary>    
/// 線程休眠一段時間    
/// </summary>    
/// <param name="timeOut"></param>
public static void Sleep(TimeSpan timeOut)   

2)輔助類ThreadHelper的使用例子代碼如下所示

CHM幫助文檔持續(xù)更新中咨堤,統(tǒng)一下載地址是: http://www.iqidi.com/download/commonshelp.rar

公用類庫DLL+XML注釋文件下載地址是:http://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菇篡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子一喘,更是在濱河造成了極大的恐慌驱还,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凸克,死亡現(xiàn)場離奇詭異议蟆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)萎战,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門咪鲜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撞鹉,你說我怎么就攤上這事疟丙。” “怎么了鸟雏?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵享郊,是天一觀的道長。 經(jīng)常有香客問我孝鹊,道長炊琉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任又活,我火速辦了婚禮苔咪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柳骄。我一直安慰自己团赏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布耐薯。 她就那樣靜靜地躺著舔清,像睡著了一般丝里。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上体谒,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天杯聚,我揣著相機(jī)與錄音,去河邊找鬼抒痒。 笑死幌绍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的故响。 我是一名探鬼主播纷捞,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼被去!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奖唯,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤惨缆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丰捷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坯墨,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年病往,在試婚紗的時候發(fā)現(xiàn)自己被綠了捣染。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡停巷,死狀恐怖耍攘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畔勤,我是刑警寧澤蕾各,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站庆揪,受9級特大地震影響式曲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缸榛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一吝羞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧内颗,春花似錦钧排、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽会烙。三九已至,卻和暖如春筒捺,著一層夾襖步出監(jiān)牢的瞬間柏腻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工系吭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留五嫂,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓肯尺,卻偏偏與公主長得像沃缘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子则吟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容