日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
在.NET多線程程序中使用異步調(diào)用的簡(jiǎn)易方法

【獨(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)行初始化,如下所示:

 
 
 
  1. //通過(guò)設(shè)置maximumCount,我們可以對(duì)簡(jiǎn)單的ThreadPool進(jìn)行摹擬。  
  2. //參數(shù)maximumCount用于指出可以同時(shí)啟動(dòng)多少個(gè)并行的線程。如果abortIfBusyParameter被設(shè)為true,那么其他線程就只能等待,或者被拒絕。  
  3. this.m_asyncWorker = new AsyncWorker(1);  
  4.  
  5. //分配一個(gè)后臺(tái)任務(wù)  
  6. this.m_asyncWorker.DoWork += new DoWorkEventHandler(m_asyncWorker_DoWork); 

您的后臺(tái)任務(wù)可以是任何您喜歡的東西: 

 
 
 
  1. void m_asyncWorker_DoWork(object sender, DoWorkEventArgs e) {  
  2.            Console.WriteLine("Hello world! I was started asynchronously.");  
  3.         }   

最后調(diào)用background worker :

 
 
 
  1. //因?yàn)閍bortIfBusyParameter 被設(shè)置為true,所以如果前面的調(diào)用仍然在運(yùn)行的話,RunWorkerAsync將返回false(中止調(diào)用)。   
  2. if (!this.m_asyncWorker.RunWorkerAsync(true)) {  
  3.  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事件。

 
 
 
  1. //分配RunWorkerCompleted。它是您的回調(diào)函數(shù)事件。  
  2. this.m_asyncWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_asyncWorker_RunWorkerCompleted); 

結(jié)束語(yǔ) 

希望這個(gè)工具可以使您的生活變得更加輕松。請(qǐng)不要詢問(wèn)JustDoSomething類的鎖定問(wèn)題,因?yàn)樗瞧渌鼫y(cè)試的一部分。

【編輯推薦】

  1. .NET上執(zhí)行多線程應(yīng)該注意的兩點(diǎn)
  2. C#多線程控制進(jìn)度條之多線程安全
  3. 通過(guò)多線程為基于.NET的應(yīng)用程序?qū)崿F(xiàn)響應(yīng)迅速
  4. .NET 4.0中任務(wù)與線程關(guān)系談
  5. 詳解.NET編程過(guò)程中的線程沖突

本文題目:在.NET多線程程序中使用異步調(diào)用的簡(jiǎn)易方法
網(wǎng)站URL:http://www.dlmjj.cn/article/dhijhge.html