新聞中心
C#多線程控制進(jìn)度條之多線程安全的具體內(nèi)容是什么呢?讓我們開(kāi)始吧:

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、成都做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出玉泉免費(fèi)做網(wǎng)站回饋大家。
到這里為止,我們已經(jīng)解決了長(zhǎng)任務(wù)的難題和傳遞參數(shù)的困擾。但是我們真的解決了全部問(wèn)題嗎?回答是否定的。
C#多線程控制進(jìn)度條之多線程安全的問(wèn)題:我們知道 Windows 編程中有一個(gè)必須遵守的原則,那就是在一個(gè)窗體創(chuàng)建線程之外的任何線程中都不允許操作窗體。
我們上面的程序就是存在這樣的問(wèn)題:工作線程是在 ShowProgress 方法中修改了用戶界面的進(jìn)度條的屬性。那為什么程序運(yùn)行沒(méi)有出現(xiàn)問(wèn)題,運(yùn)行正常呢?
沒(méi)有發(fā)生問(wèn)題是因?yàn)槭乾F(xiàn)在的Windows XP操作系統(tǒng)對(duì)這類問(wèn)題有非常健壯的解決方法,讓我們避免了問(wèn)題的發(fā)生。但是我們現(xiàn)在的程序不能保證在其他的操作系統(tǒng)能夠運(yùn)行正常!
真正的解決方法是我們能夠認(rèn)識(shí)到問(wèn)題所在,并在程序中加以避免。
C#多線程控制進(jìn)度條之多線程安全圖
如何避免多線程的窗體資源訪問(wèn)的安全問(wèn)題呢?其實(shí)非常簡(jiǎn)單,有兩種方法:
一種方法就是不管線程是否是用戶界面線程,對(duì)用戶界面資源的訪問(wèn)統(tǒng)一由委托完成;
另一種方法是在每個(gè) Windows Forms 用戶界面類中都有一個(gè) InvokeRequired 屬性,它用來(lái)標(biāo)識(shí)當(dāng)前線程是否能夠直接訪問(wèn)窗體資源。我們只需要檢查這個(gè)屬性的值,只有當(dāng)允許直接訪問(wèn)窗體資源時(shí)才直接訪問(wèn)相應(yīng)的資源,否則,就需要通過(guò) 委托進(jìn)行訪問(wèn)了。
C#多線程控制進(jìn)度條之多線程安全實(shí)現(xiàn):
采用***種安全的方法的代碼片斷如下:
- // 顯示進(jìn)度條的委托聲明
- delegate void ShowProgressDelegate(
- int totalStep, int currentStep );
- // 顯示進(jìn)度條
- void ShowProgress( int totalStep, int currentStep )
- {
- _Progress.Maximum = totalStep;
- _Progress.Value = currentStep;
- }
- // 執(zhí)行任務(wù)的委托聲明
- delegate void RunTaskDelegate( int seconds );
- // 執(zhí)行任務(wù)
- void RunTask( int seconds )
- {
- ShowProgressDelegate showProgress =
- new ShowProgressDelegate( ShowProgress );
- // 每 1 / 4 秒 顯示進(jìn)度一次
- for( int i = 0; i < seconds * 4; i++ )
- {
- Thread.Sleep( 250 );
- // 顯示進(jìn)度條
- this.Invoke( showProgress,
- new object[] { seconds * 4, i + 1 } );
- }
- }
C#多線程控制進(jìn)度條之多線程安全實(shí)現(xiàn):
采用第二種安全的方法的代碼片斷如下:
- // 顯示進(jìn)度條的委托聲明
- delegate void ShowProgressDelegate(
- int totalStep, int currentStep );
- // 顯示進(jìn)度條
- void ShowProgress( int totalStep, int currentStep )
- {
- if( _Progress.InvokeRequired )
- {
- ShowProgressDelegate showProgress =
- new ShowProgressDelegate( ShowProgress );
- // 為了避免工作線程被阻塞,采用異步調(diào)用委托
- this.BeginInvoke(
- showProgress, new object[] {
- totalStep, currentStep } );
- }
- else
- {
- _Progress.Maximum = totalStep;
- _Progress.Value = currentStep;
- }
- } //C#多線程控制進(jìn)度條之多線程安全
- // 執(zhí)行任務(wù)的委托聲明
- delegate void RunTaskDelegate( int seconds );
- // 執(zhí)行任務(wù)
- void RunTask( int seconds )
- {
- // 每 1 / 4 秒 顯示進(jìn)度一次
- for( int i = 0; i < seconds * 4; i++ )
- {
- Thread.Sleep( 250 );
- // 顯示進(jìn)度條
- ShowProgress( seconds * 4, i + 1 );
- } //C#多線程控制進(jìn)度條之多線程安全
- }
至此,我們用了幾個(gè)示例說(shuō)明了如何執(zhí)行長(zhǎng)任務(wù)、如何通過(guò)多線程異步處理任務(wù)進(jìn)度的顯示并解決了多線程的安全性等問(wèn)題。希望能夠給大家對(duì)理解多線程編程、委托的使用、異步調(diào)用等方面提供一些幫助,也希望能和大家進(jìn)行進(jìn)一步的溝通和交流。
C#多線程控制進(jìn)度條之多線程安全相關(guān)的內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)C#多線程控制進(jìn)度條之多線程安全有所幫助。
【編輯推薦】
- C#進(jìn)度條之控制臺(tái)顯示淺析
- C# WinForm進(jìn)度條實(shí)現(xiàn)淺析
- C#多線程控制進(jìn)度條之長(zhǎng)任務(wù)操作
- C#多線程控制進(jìn)度條之長(zhǎng)異步操作
- C#多線程控制進(jìn)度條之異步調(diào)用
文章題目:C#多線程控制進(jìn)度條之多線程安全
標(biāo)題來(lái)源:http://www.fisionsoft.com.cn/article/cdhhcpd.html


咨詢
建站咨詢
