厚积薄发,丰富的公用类库积累,助你高效进行系统开发(11)---各种线程相关操作类...
俗話說(shuō),一個(gè)好漢十個(gè)幫,眾人拾柴火焰高等都說(shuō)明一個(gè)道理,有更多的資源,更豐富的積累,都是助你走向成功,走向頂峰的推動(dòng)力。
本篇的公用類庫(kù)的介紹主題是程序開(kāi)發(fā)中多線程操作環(huán)境中,常用到的線程相關(guān)類,本篇隨筆介紹包含單件創(chuàng)建輔助類、Timer定時(shí)器、委托處理輔助類、隊(duì)列的線程處理服務(wù)輔助類、可以取消執(zhí)行操作的線程池輔助類、線程池輔助類、線程輔助類等對(duì)象,這些輔助類覆蓋了多線程開(kāi)發(fā)中絕大多數(shù)的應(yīng)用。良好的封裝及操作,給我們提供非常方便、高效的線程操作處理。
本篇繼續(xù)繼續(xù)整理優(yōu)化已有的共用類庫(kù),并繼續(xù)發(fā)表隨筆介紹公用類庫(kù)的接口方法以及詳細(xì)使用操作,力求給自己繼續(xù)優(yōu)化,積攢更豐富的公用類庫(kù)資源,加深了解的同時(shí),也給大家展現(xiàn)公用類庫(kù)好的方面。
厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(10)---各種線程同步的集合類
厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(9)----各種常用輔助類
厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(8)----非對(duì)稱加密、BASE64加密、MD5等常用加密處理
厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(7)-----聲音播放、硬件信息、鍵盤模擬及鉤子、鼠標(biāo)模擬及鉤子等設(shè)備相關(guān)?
厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(6)----全屏截圖、圖標(biāo)獲取、圖片打印、頁(yè)面預(yù)覽截屏、圖片復(fù)雜操作等
厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(5)----熱鍵、多線程、窗體動(dòng)畫凍結(jié)等窗體操作
厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(4)----CSV、Excel、INI文件、獨(dú)立存儲(chǔ)等文件相關(guān)
厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(3)----數(shù)據(jù)庫(kù)相關(guān)操作
厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(2)----常用操作
厚積薄發(fā),豐富的公用類庫(kù)積累,助你高效進(jìn)行系統(tǒng)開(kāi)發(fā)(1)----開(kāi)篇總結(jié)
1、單件操作輔助類 Singleton。??
實(shí)現(xiàn)效果
1)?本輔助類主要是用來(lái)方便實(shí)現(xiàn)類對(duì)象的單件實(shí)例操作,減少重復(fù)寫單件實(shí)現(xiàn)代碼的繁瑣,簡(jiǎn)化類的代碼。?
2)創(chuàng)建一個(gè)類對(duì)象的單件實(shí)例,類對(duì)象的構(gòu)造函數(shù)不能為Public修飾符的,一般為private。
?
實(shí)現(xiàn)代碼
1)輔助類提供的方法源碼如下所示:?
/// <summary>/// 創(chuàng)建一個(gè)類對(duì)象的單件實(shí)例,類對(duì)象的構(gòu)造函數(shù)不能為Public修飾符的,一般為private。
/// </summary>
/// <typeparam name="T">待創(chuàng)建的對(duì)象類</typeparam>
public static class Singleton<T> where T : class
{
static volatile T _instance;
static object _lock = new object();
static Singleton()
{
}
/// <summary>
/// 創(chuàng)建/獲取一個(gè)可以new的類對(duì)象的單件實(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}'里面沒(méi)有找到private或者protected的構(gòu)造函數(shù)。", typeof(T).Name));
}
_instance = (T)constructor.Invoke(null);
}
}
return _instance;
}
}
2)輔助類Singleton的使用例子代碼如下所示
/// <summary>/// 單件測(cè)試類
/// </summary>
public class TestSingletonClass
{
/// <summary>
/// 私有構(gòu)造函數(shù)
/// </summary>
private TestSingletonClass()
{
}
public void ShowMessage()
{
MessageUtil.ShowTips("單件實(shí)例測(cè)試函數(shù)");
}
}
private void btnSingleton_Click(object sender, EventArgs e)
{
//單件輔助類使用代碼
Singleton<TestSingletonClass>.Instance.ShowMessage();
}
如果沒(méi)有使用單件輔助類,那么單件的測(cè)試類將會(huì)需要這樣書寫,很明顯多了很多行代碼,如果每個(gè)想單件處理的類都要這樣寫,代碼量還是很可觀的,而且比較繁瑣。
/// 單件測(cè)試類
/// </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í)例測(cè)試函數(shù)");
}
}
?
2、定期執(zhí)行某些任務(wù)的定時(shí)器輔助類Timer。??
實(shí)現(xiàn)效果
1) ?本輔助類主要是用來(lái)方便實(shí)現(xiàn)定時(shí)器輔助類,功能和另外一個(gè)定時(shí)器輔助類TimerHelper差不多。
2)?定時(shí)器操作,都通過(guò)對(duì)象鎖以及在運(yùn)行處理事件的時(shí)候,動(dòng)態(tài)改變間隔事件為無(wú)限等待,處理完成后修改為間隔時(shí)間的方式,實(shí)現(xiàn)對(duì)定時(shí)器的正常、安全執(zhí)行,不會(huì)發(fā)生運(yùn)行一半又跳到下一個(gè)的處理過(guò)程中。?
3).NET提供了3種定時(shí)器實(shí)現(xiàn),他們的特點(diǎn)如下所示。該Timer輔助類是基于Threading.Timer的定時(shí)器實(shí)現(xiàn)。
| Server Timers | System.Timers.Timer | 基于服務(wù)器的計(jì)時(shí)器,位于"工具箱"的“組件”選項(xiàng)卡上 |
| Thread Timers | System.Threading.Timer | 在編程時(shí)使用的線程計(jì)時(shí)器 |
| Windows Timers | System.Windows.Forms.Timer | 基于 Windows 的標(biāo)準(zhǔn)計(jì)時(shí)器,"工具箱"的"Windows 窗體"選項(xiàng)卡上; |
實(shí)現(xiàn)代碼
1)輔助類提供的方法接口如下所示:?
#region 事件或?qū)傩?/// <summary>
/// 按定時(shí)器周期定期引發(fā)的事件
/// </summary>
public event EventHandler Elapsed;
/// <summary>
/// 定時(shí)器任務(wù)間隔(毫秒)
/// </summary>
public int Period { get; set; }
/// <summary>
/// 指示是否在方法開(kāi)始的時(shí)候,啟動(dòng)定時(shí)器Elapsed事件一次。默認(rèn)為false。
/// </summary>
public bool RunOnStart { get; set; }
#endregion
#region 構(gòu)造函數(shù)
/// <summary>
/// 創(chuàng)建一個(gè)定時(shí)器
/// </summary>
/// <param name="period">定時(shí)器間隔 (毫秒)</param>
public Timer(int period) : this(period, false)
/// <summary>
/// 創(chuàng)建一個(gè)定時(shí)器
/// </summary>
/// <param name="period">定時(shí)器間隔 (毫秒)</param>
/// <param name="runOnStart">指示是否在方法開(kāi)始的時(shí)候,啟動(dòng)定時(shí)器Elapsed事件一次</param>
public Timer(int period, bool runOnStart)
#endregion
#region 方法
/// <summary>
/// 啟動(dòng)定時(shí)器
/// </summary>
public void Start()
/// <summary>
/// 停止定時(shí)器
/// </summary>
public void Stop()
/// <summary>
/// 等待定時(shí)器停止
/// </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、定時(shí)器輔助類TimerHelper,可指定運(yùn)行間隔、延遲啟動(dòng)時(shí)間等操作。??
實(shí)現(xiàn)效果
1)?本輔助類主要是用來(lái)方便實(shí)現(xiàn)定時(shí)器輔助類,可指定運(yùn)行間隔、延遲啟動(dòng)時(shí)間等操作。功能和另外一個(gè)定時(shí)器輔助類Timer差不多。?
2)定時(shí)器操作,都通過(guò)對(duì)象鎖以及在運(yùn)行處理事件的時(shí)候,動(dòng)態(tài)改變間隔事件為無(wú)限等待,處理完成后修改為間隔時(shí)間的方式,實(shí)現(xiàn)對(duì)定時(shí)器的正常、安全執(zhí)行,不會(huì)發(fā)生運(yùn)行一半又跳到下一個(gè)的處理過(guò)程中。?
?
實(shí)現(xiàn)代碼
1)輔助類提供的方法接口如下所示:?
?
/// <summary>/// 定時(shí)器執(zhí)行操作的函數(shù)原型
/// </summary>
public delegate void TimerExecution();
/// <summary>
/// 定時(shí)器執(zhí)行時(shí)調(diào)用的操作
/// </summary>
public event TimerExecution Execute;
/// <summary>
/// 創(chuàng)建一個(gè)指定時(shí)間間隔的定時(shí)器,并在指定的延遲后開(kāi)始啟動(dòng)。(默認(rèn)間隔為100毫秒)
/// </summary>
public TimerHelper()
/// <summary>
/// 創(chuàng)建一個(gè)指定時(shí)間間隔的定時(shí)器,并在指定的延遲后開(kāi)始啟動(dòng)。
/// </summary>
/// <param name="interval">定時(shí)器執(zhí)行操作的間隔時(shí)間(毫秒)</param>
/// <param name="startDelay">指定的延遲時(shí)間(毫秒)</param>
public TimerHelper(long interval, int startDelay)
/// <summary>
/// 創(chuàng)建一個(gè)指定時(shí)間間隔的定時(shí)器
/// </summary>
/// <param name="interval">定時(shí)器執(zhí)行操作的間隔時(shí)間(毫秒)</param>
/// <param name="start">是否啟動(dòng)</param>
public TimerHelper(long interval, bool start)
/// <summary>
/// 啟動(dòng)定時(shí)器并指定延遲時(shí)間(毫秒)
/// </summary>
/// <param name="delayBeforeStart">指定延遲時(shí)間(毫秒)</param>
public void Start(int delayBeforeStart)
/// <summary>
/// 立即啟動(dòng)定時(shí)器
/// </summary>
public void Start()
/// <summary>
/// 暫停定時(shí)器
/// 注意:運(yùn)行中的線程不會(huì)被停止
/// </summary>
public void Pause()
/// <summary>
/// 停止定時(shí)器
/// 注意:運(yùn)行中的線程不會(huì)被停止
/// </summary>
public void Stop()
/// <summary>
/// 定時(shí)器的處理時(shí)間
/// </summary>
/// <param name="obj"></param>
public void Tick(object obj)
/// <summary>
/// 定時(shí)器的狀態(tài)
/// </summary>
public TimerState State
/// <summary>
/// 獲取或設(shè)置定時(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í)器,定時(shí)刷新窗體的數(shù)據(jù),并提示客戶更新情況
int interval = Portal.gc.GetRefreshSecond();//獲取定時(shí)間隔時(shí)間
TimerHelper timer = new TimerHelper(interval, true);
timer.Execute += new TimerHelper.TimerExecution(timer_Execute);
}
}
//通過(guò)Invoke來(lái)實(shí)現(xiàn)跨線程間的調(diào)用
void timer_Execute()
{
if (!this.InvokeRequired)
return;
this.Invoke(new MethodInvoker(delegate()
{
NotifyNewHouse();
}));
}
4、提供一個(gè)隊(duì)列的線程處理服務(wù)輔助類 QueueServer。???
實(shí)現(xiàn)效果
1) ?本輔助類主要是用來(lái)方便實(shí)現(xiàn)提供一個(gè)隊(duì)列的線程處理服務(wù)操作。QueueServer是一個(gè)先入先出(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ì)象加到隊(duì)列結(jié)尾
/// </summary>
/// <param name="item"></param>
public void EnqueueItem(T item)
/// <summary>
/// 清除隊(duì)列
/// </summary>
public void ClearItems()
#endregion
#region 線程處理
/// <summary>
/// 處理單個(gè)元素
/// </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>
/// 處理每個(gè)出隊(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)?本輔助類主要是用來(lái)方便實(shí)現(xiàn)可以取消執(zhí)行操作的線程池操作。?
2)AbortableThreadPool線程輔助類可以使用常用的多線程處理環(huán)境中,也可以使用在有些在運(yùn)行過(guò)程中可能需要取消的線程處理環(huán)境中。
?
實(shí)現(xiàn)代碼
1)輔助類提供的方法接口如下所示:?
/// <summary>/// 把執(zhí)行操作放到隊(duì)列中。當(dāng)線程池的線程可用的時(shí)候,方法執(zhí)行。
/// </summary>
/// <param name="callback">一個(gè)代表將要執(zhí)行方法的WaitCallback對(duì)象</param>
public static WorkItem QueueUserWorkItem(WaitCallback callback)
/// <summary>
/// 把執(zhí)行操作放到隊(duì)列中,并指定了一個(gè)對(duì)象,它包含將要執(zhí)行方法的數(shù)據(jù)。
/// 當(dāng)線程池的線程可用的時(shí)候,方法執(zhí)行。
/// </summary>
/// <param name="callback">一個(gè)代表將要執(zhí)行方法的WaitCallback對(duì)象</param>
/// <param name="state">一個(gè)對(duì)象,它包含將要執(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">等待的時(shí)間范圍</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)?本輔助類主要是用來(lái)方便實(shí)現(xiàn)委托的處理。?
2)使用委托處理輔助類DelegateHelper,可以快速執(zhí)行或者取消一些委托方法的執(zhí)行。
?
實(shí)現(xiàn)代碼
1)輔助類提供的方法接口如下所示:?
?
/// <summary>/// 執(zhí)行委托操作
/// </summary>
/// <param name="target">目標(biāo)委托對(duì)象</param>
/// <param name="args">參數(shù)</param>
public static WorkItem InvokeDelegate(Delegate target, params object[] args)
/// <summary>
/// 執(zhí)行委托操作
/// </summary>
/// <param name="target">目標(biāo)委托對(duì)象</param>
public static WorkItem InvokeDelegate(Delegate target)
/// <summary>
/// 中止指定的隊(duì)列中委托
/// </summary>
/// <param name="target">目標(biāo)委托對(duì)象</param>
/// <returns>項(xiàng)目隊(duì)列中止操作的狀態(tài)</returns>
public static WorkItemStatus AbortDelegate(WorkItem target)
2)輔助類DelegateHelper的使用例子代碼如下所示
private void btnDelegeteHelper_Click(object sender, EventArgs e){
//無(wú)參數(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) 本輔助類主要是用來(lái)方便實(shí)現(xiàn)線程池輔助操作。。?
實(shí)現(xiàn)代碼
1)輔助類提供的方法接口如下所示:
/// <summary>/// 方法委托
/// </summary>
public delegate void WaitCallbackNew();
/// <summary>
/// 把執(zhí)行方法放到隊(duì)列中。
/// 當(dāng)線程池線程變?yōu)榭捎玫臅r(shí)候,方法執(zhí)行。
/// </summary>
/// <param name="callback">委托對(duì)象</param>
public static bool QueueUserWorkItem(WaitCallbackNew callback)
/// <summary>
/// 把執(zhí)行方法放到隊(duì)列中。
/// 當(dāng)線程池線程變?yōu)榭捎玫臅r(shí)候,方法執(zhí)行。
/// </summary>
/// <param name="proc">委托對(duì)象數(shù)組</param>
/// <returns></returns>
public static bool QueueUserWorkItems(params WaitCallbackNew[] proc)
/// <summary>
///等待指定數(shù)組中所有元素收到信號(hào)
/// </summary>
public static bool WaitAll()
/// <summary>
///等待指定數(shù)組中任何一個(gè)元素收到信號(hào)
/// </summary>
/// <returns>滿足等待的對(duì)象數(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)?本輔助類主要是用來(lái)方便實(shí)現(xiàn)線程的各種操作,包括設(shè)置線程名稱、優(yōu)先級(jí)等及把執(zhí)行方法放到隊(duì)列中執(zhí)行等基礎(chǔ)性的線程操作。
?
實(shí)現(xiàn)代碼
1)輔助類提供的方法接口如下所示:
?
/// <summary>/// 線程名稱,最長(zhǎng)不超過(guò)10個(gè)字符!
/// </summary>
/// <param name="name">線程名稱</param>
public static void SetThreadName(string name)
/// <summary>
/// 設(shè)置線程優(yōu)先級(jí)
/// </summary>
/// <param name="priority">線程優(yōu)先級(jí)</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ì)列中,并指定了一個(gè)對(duì)象,它包含使用該方法的數(shù)據(jù)。
/// 當(dāng)線程池線程變?yōu)榭捎玫臅r(shí)候,方法執(zhí)行。
/// </summary>
/// <param name="callBack">工作項(xiàng)(WaitCallback)對(duì)象</param>
/// <param name="threadName">線程名稱,最長(zhǎng)不超過(guò)10個(gè)字符!</param>
/// <param name="priority">線程優(yōu)先級(jí)</param>
public static bool Queue(WaitCallback callBack, string threadName, ThreadPriority priority)
/// <summary>
/// 把執(zhí)行方法放到隊(duì)列中,并指定了一個(gè)對(duì)象,它包含使用該方法的數(shù)據(jù)。
/// 當(dāng)線程池線程變?yōu)榭捎玫臅r(shí)候,方法執(zhí)行。
/// </summary>
/// <param name="callBack">工作項(xiàng)(WaitCallback)對(duì)象</param>
/// <param name="threadName">線程名稱,最長(zhǎng)不超過(guò)10個(gè)字符!</param>
/// <param name="state">執(zhí)行方法的數(shù)據(jù)</param>
/// <param name="priority">線程優(yōu)先級(jí)</param>
public static bool Queue(WaitCallback callBack, string threadName, object state, ThreadPriority priority)
/// <summary>
/// 線程休眠一段毫秒時(shí)間
/// </summary>
/// <param name="millisecondsTimeout">一段毫秒時(shí)間</param>
public static void Sleep(int millisecondsTimeout)
/// <summary>
/// 線程休眠一段時(shí)間
/// </summary>
/// <param name="timeOut"></param>
public static void Sleep(TimeSpan timeOut)
2)輔助類ThreadHelper的使用例子代碼如下所示
?
CHM幫助文檔持續(xù)更新中,統(tǒng)一下載地址是:?http://www.iqidi.com/download/commonshelp.rar?最新公用類庫(kù)DLL+XML注釋文件下載地址是:http://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的厚积薄发,丰富的公用类库积累,助你高效进行系统开发(11)---各种线程相关操作类...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 蔡司首款全画幅智能相机滑铁卢:ZX1被曝
- 下一篇: U盘病毒及其相关资源的分析(patch