新聞中心
【獨(dú)家特稿】簡(jiǎn)介

網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)介紹好的網(wǎng)站是理念、設(shè)計(jì)和技術(shù)的結(jié)合。創(chuàng)新互聯(lián)擁有的網(wǎng)站設(shè)計(jì)理念、多方位的設(shè)計(jì)風(fēng)格、經(jīng)驗(yàn)豐富的設(shè)計(jì)團(tuán)隊(duì)。提供PC端+手機(jī)端網(wǎng)站建設(shè),用營(yíng)銷思維進(jìn)行網(wǎng)站設(shè)計(jì)、采用先進(jìn)技術(shù)開(kāi)源代碼、注重用戶體驗(yàn)與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺(jué)化效果。
對(duì)于開(kāi)發(fā)者來(lái)說(shuō),運(yùn)行異步任務(wù)簡(jiǎn)直就是一場(chǎng)惡夢(mèng),特別是初學(xué)者更是如此。在本文附帶的代碼中,您將發(fā)現(xiàn)一個(gè)簡(jiǎn)單的AsyncWorker類,它能夠使您輕松完成異步任務(wù)的處理,即使您對(duì)異步調(diào)用沒(méi)有全面深入的了解。當(dāng)然,我們也很希望看到您貢獻(xiàn)的代碼,尤其是對(duì)于ReportProgress函數(shù),因?yàn)樗€未經(jīng)測(cè)試。
背景知識(shí)
我為什么編寫這個(gè)助手類(helper class)呢? 簡(jiǎn)單地說(shuō),這是因?yàn)槲也幌矚g.NET BackgroundWorker類,以及所有與IsBusy參數(shù)有關(guān)的問(wèn)題。有時(shí)候,即使您成功地終止了異步任務(wù),IsBusy也不會(huì)從true變?yōu)閒alse。類backgroundWorker會(huì)強(qiáng)迫您在while循環(huán)中使用Application.DoEvents。也許還有其它正確使用它的方法,但是我至今還沒(méi)找到。我嘗試按照backgroundWorker的設(shè)計(jì)方法建立一個(gè)盡可能簡(jiǎn)單的替換物。
代碼用法
如果您看過(guò)BackgroundWorker的文檔,那么使用下面的代碼也應(yīng)該不成問(wèn)題。為了初始化AsyncWorker,我們做如下定義:
AsyncCallback m_asyncWorker;
然后,在您的代碼(構(gòu)造函數(shù))中對(duì)其進(jìn)行初始化,如下所示:
- //通過(guò)設(shè)置maximumCount,我們可以對(duì)簡(jiǎn)單的ThreadPool進(jìn)行摹擬。
- //參數(shù)maximumCount用于指出可以同時(shí)啟動(dòng)多少個(gè)并行的線程。如果abortIfBusyParameter被設(shè)為true,那么其他線程就只能等待,或者被拒絕。
- this.m_asyncWorker = new AsyncWorker(1);
- //分配一個(gè)后臺(tái)任務(wù)
- this.m_asyncWorker.DoWork += new DoWorkEventHandler(m_asyncWorker_DoWork);
您的后臺(tái)任務(wù)可以是任何您喜歡的東西:
- void m_asyncWorker_DoWork(object sender, DoWorkEventArgs e) {
- Console.WriteLine("Hello world! I was started asynchronously.");
- }
最后調(diào)用background worker :
- //因?yàn)閍bortIfBusyParameter 被設(shè)置為true,所以如果前面的調(diào)用仍然在運(yùn)行的話,RunWorkerAsync將返回false(中止調(diào)用)。
- if (!this.m_asyncWorker.RunWorkerAsync(true)) {
- Console.WriteLine("Worker in use....");
- }
通過(guò)把RunWorkerAsync參數(shù)abortIfBusy設(shè)置為true,即使前面的異步調(diào)用仍在運(yùn)行,您也可以跳過(guò)這個(gè)事件。通過(guò)將其設(shè)為false,它會(huì)進(jìn)入一個(gè)等待隊(duì)列,并在IsBusy從true轉(zhuǎn)換為false的時(shí)候馬上觸發(fā)。 這個(gè)機(jī)制對(duì)于性能敏感的應(yīng)用程序來(lái)說(shuō)非常有用。如果您有許多啟動(dòng)異步調(diào)用的“低優(yōu)先級(jí)”事件,并且如果前面的異步調(diào)用仍在運(yùn)行(IsBusy),那么您可以決定是否應(yīng)該啟動(dòng)另一個(gè)異步調(diào)用。
例如:如果您在屏幕上拖動(dòng)一個(gè)對(duì)象的時(shí)候,那么就無(wú)需每次都重繪它。只有當(dāng)IsBusy為false的時(shí)候才需對(duì)其進(jìn)行繪制。 如果您想要獲得平滑效果,只需增加maximumCount(您的線程池)即可。
最后,如果您需要一個(gè)回調(diào)函數(shù),那么您可以自己預(yù)訂RunWorkerCompleted事件。
- //分配RunWorkerCompleted。它是您的回調(diào)函數(shù)事件。
- this.m_asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_asyncWorker_RunWorkerCompleted);
結(jié)束語(yǔ)
希望這個(gè)工具可以使您的生活變得更加輕松。請(qǐng)不要詢問(wèn)JustDoSomething類的鎖定問(wèn)題,因?yàn)樗瞧渌鼫y(cè)試的一部分。
【編輯推薦】
- .NET上執(zhí)行多線程應(yīng)該注意的兩點(diǎn)
- C#多線程控制進(jìn)度條之多線程安全
- 通過(guò)多線程為基于.NET的應(yīng)用程序?qū)崿F(xiàn)響應(yīng)迅速
- .NET 4.0中任務(wù)與線程關(guān)系談
- 詳解.NET編程過(guò)程中的線程沖突
本文題目:在.NET多線程程序中使用異步調(diào)用的簡(jiǎn)易方法
網(wǎng)站URL:http://www.dlmjj.cn/article/dhijhge.html


咨詢
建站咨詢
