基于C#實(shí)現(xiàn)的輕量級(jí)多線程隊(duì)列

工作中我們經(jīng)常會(huì)遇到一些一些功能需要實(shí)現(xiàn)造作日志,數(shù)據(jù)修改日志,對(duì)于這種業(yè)務(wù)需求如果我們以同步的方式實(shí)現(xiàn),難免會(huì)影響到系統(tǒng)的性能。如下我列出集中解決方案。

使用Thread異步處理。

使用線程池或Task異步處理。

以上兩種方案確實(shí)能解決我們此場(chǎng)景的需求,但是同時(shí)也帶來(lái)了問題。

第一種方式,使用thread的情況下我們無(wú)法控制創(chuàng)建的線程數(shù)量,要知道創(chuàng)建線程是一個(gè)很耗性能的操作。

第二種方式,使用線程池或者Task我們雖然可以通過設(shè)置線程池的最大線程數(shù)量來(lái)限制線程最大數(shù),但是這個(gè)設(shè)置由于是全局的,就會(huì)造成所有使用線程池或Task的地方都會(huì)受到此設(shè)置的限制。

當(dāng)然,第二種方式肯定是優(yōu)于第一種方式的,我們都是有追求的程序員,做事情當(dāng)然是追求精益求精?;诖怂枷氲尿?qū)動(dòng)我實(shí)現(xiàn)了一個(gè)輕量級(jí)的多線程隊(duì)列。她有如下特點(diǎn):

可以設(shè)置線程數(shù)量,空閑睡眠次數(shù),空閑睡眠時(shí)間。空閑睡眠次數(shù)和空閑睡眠時(shí)間共同控制線程的銷毀。

可以設(shè)置任務(wù)的優(yōu)先級(jí),提供三種優(yōu)先級(jí):LOWEST,NORMAL,HIGHEST。

可以設(shè)置多線程的模式是使用Thread還是使用Task.

可以提高任務(wù)的優(yōu)先級(jí)。

當(dāng)然首先要說(shuō)的是使用方法,當(dāng)我設(shè)置使用一個(gè)線程的時(shí)候如下代碼:

輸出結(jié)果如下

可以看到使用QueueManager類的線程都是id=4的線程上執(zhí)行,這是由于我們?cè)O(shè)置的是一個(gè)線程,主線程的id為1,并且可以看到Job中的代碼是異步執(zhí)行的。當(dāng)我們將線程數(shù)設(shè)置成2的時(shí)候輸出如下

使用其它是不是很簡(jiǎn)單??

那么我分別來(lái)講一下QueueManager類的參數(shù)

QueueConfirguration類,結(jié)構(gòu)如下。

TaskMaxCount:線程數(shù)量,TaskDelay:為空閑時(shí)線程睡眠時(shí)間(ms單位),delayTimes:睡眠次數(shù)

2. QueueTaskMode:枚舉類型,提供兩種多線程使用方式Thread和Task

3.JobPriorityScheduleConfig:實(shí)現(xiàn)接口IJobPriorityScheduleConfig,用來(lái)提升Job的優(yōu)先級(jí)。

各位朋友可能也看到了我使用了一個(gè)Job類,目前總共有三種Job類型

Job:無(wú)參數(shù)無(wú)返回

Job<T>:有參數(shù)無(wú)返回

Job<T1, T2> :有參數(shù)有返回, 同時(shí)提供執(zhí)行完成之后返回參數(shù)的callback事件。

當(dāng)然,代碼中還有很多地方可以優(yōu)化,譬如:

當(dāng)線程處于睡眠中時(shí),有Job需要執(zhí)行時(shí)的interrupt.

AddJob方法可以加一些重載。

實(shí)現(xiàn)中的事件可以修改為委托,以達(dá)到減少一些委托類型的定義。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容