本篇內(nèi)容介紹了“如何理解C#特有線程功能”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)建站自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計、網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團(tuán)隊及專業(yè)的網(wǎng)站設(shè)計師團(tuán)隊。
C#特有線程功能
C#特有線程功能,我們一直對C#抱有很高的期望,C#中確實有一些Java不支持的方法、類和函數(shù),對于鐵桿的Java線程編程人員而言,這可是一件好事,因為他們可以用C#編寫代碼,然后在Java代碼中引用。
要在Java中獲得某一變量的鎖,必須在代碼的首尾二端加上synchronized關(guān)健字,指明需要獲得鎖的對象。一旦線程開始執(zhí)行 synchronized塊中的代碼,它就獲得了對這一對象的鎖的控制權(quán)。同樣,一旦線程已經(jīng)離開了synchronized塊,它也將釋放這一對象的鎖。我們已經(jīng)知道,C#也有一個相似的被稱作lock的關(guān)健字。除了lock這個關(guān)健字外,C#還提供了內(nèi)置的獲得和釋放鎖的方法:Monitor.Enter(object obj)和Monitor.Exit(object obj),通過使用這些方法,編程人員可以獲得與使用lock相同的作用,但提供了更精確的控制方法。例如,可以在一個方法中鎖定幾個變量,而不同時或在代碼中的不同部分釋放它們。
對一個需要進(jìn)行同步的對象執(zhí)行System.Threading.Monitor.Enter操作將使線程獲得該對象的鎖,或者在由其他線程控制著該對象的鎖時進(jìn)行阻塞。通過執(zhí)行Monitor.Exit方法就可以釋放鎖,如果線程已經(jīng)不控制著該對象的鎖了,這一方法將會產(chǎn)生一個 System.Threading.SynchronizationLockException異常信號。
C#中的Monitor類不但包括Enter方法,還包括TryEnter方法,如果執(zhí)行該方法,就會或者獲得一個鎖,或者返回一個表明它不能獲得鎖的返回值。
原子操作
System.Threading.Interlocked類提供了程序?qū)τ蓭讉€線程共享的變量進(jìn)行同步訪問的能力,C#把一些操作抽象為“原子”操作或“不可分割”的操作。為了說明這一問題是如何解決的,我們來看一下下面的Java代碼:
public static int x = 1; public static void increment() { xx = x 1; }
如果有二個不同的線程同時調(diào)用increment(),x***的值可能是2或3,發(fā)生這種情況的原因可能是二個進(jìn)程無序地訪問x變量,在沒有將x置初值時對它執(zhí)行加1操作;在任一線程有機(jī)會對x執(zhí)行加1操作之前,二個線程都可能將x讀作1,并將它設(shè)置為新的值。
在Java和C#中,我們都可以實現(xiàn)對x變量的同步訪問,所有進(jìn)程都可以按各自的方式運行。但通過使用Interlocked類,C#提供了一個對這一問題更徹底的解決方案。Interlocked類有一些方法,例如Increment(ref int location)、Decrement(ref int location),這二個方法都取得整數(shù)型參數(shù),對該整數(shù)執(zhí)行加或減1操作,并返回新的值,所有這些操作都以“不可分割的”方式進(jìn)行,這樣就無需單***建一個可以進(jìn)行同步操作的對象,如下例所示:
public static Object locker = ... public static int x = 1; public static void increment() { synchronized( locker ) { xx = x 1; } }
C#中的Interlocked類可以用下面的代碼完成相同的操作:
public static int x = 1; public static void Increment() { Interlocked.Increment( ref x ); }
Interlocked中還包括一個名字為Exchange的方法,可以“不可分割”地將一個變量的值設(shè)置為另一個變量的值。
線程池
如果許多利用了線程的應(yīng)用軟件都創(chuàng)建線程,這些線程將會因等待某些條件(鍵盤或新的I/O輸入等)而在等待狀態(tài)中浪費大部分的時間,C#提供的 System.Threading.ThreadPool對象可以解決這一問題。使用ThreadPool和事件驅(qū)動的編程機(jī)制,程序可以注冊一個 System.Threading.WaitHandle對象(WaitHandle是C#編程中等待和通知機(jī)制的對象模型)和 System.Threading.WaitOrTimerCallback對象,所有的線程無需自己等待WaitHandle的釋放,ThreadPool將監(jiān)控所有向它注冊的WaitHandle,然后在WaitHandle被釋放后調(diào)用相應(yīng) WaitOrTimerCallback對象的方法。
“如何理解C#特有線程功能”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!