自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

強(qiáng)化VB.NET編程多線程句柄技巧

開發(fā) 后端
文章主要介紹了VB.NET編程,介紹了VB.NET編程中通常使用三類等待句柄:互斥對(duì)象、ManualResetEvent和AutoResetEvent。后兩種通常用于同步事件。

VB.NET編程經(jīng)過長時(shí)間的發(fā)展,很多用戶都很了解VB.NET編程中多線程程序。多線程成為大多程序員苦惱的事,現(xiàn)在和大家交流一下多線程。多線程是可行的,因?yàn)椴僮飨到y(tǒng)是多任務(wù)的,它有模擬同一時(shí)刻運(yùn)行多個(gè)應(yīng)用程序的能力。盡管多數(shù)個(gè)人計(jì)算機(jī)只有一個(gè)處理器,但是現(xiàn)在的操作系統(tǒng)還是通過在多個(gè)執(zhí)行代碼片斷之間劃分處理器時(shí)間提供了多任務(wù)。線程可能是整個(gè)應(yīng)用程序,但通常是應(yīng)用程序可以單獨(dú)運(yùn)行的一個(gè)部分。操作系統(tǒng)根據(jù)線程的優(yōu)先級(jí)和離最近運(yùn)行的時(shí)間長短給每一個(gè)線程分配處理時(shí)間。多線程對(duì)于時(shí)間密集型事務(wù)(例如文件輸入輸出)應(yīng)用程序的性能有很大的提高。VB.NET編程中通常使用三類等待句柄:互斥對(duì)象、ManualResetEvent和AutoResetEvent。后兩種通常用于同步事件。

1.互斥對(duì)象

互斥對(duì)象都是同步對(duì)象,它們只能在一個(gè)時(shí)刻由一個(gè)線程擁有。實(shí)際上,互斥這個(gè)名字衍生自互斥對(duì)象的所有權(quán)是相互排斥的。當(dāng)線程請(qǐng)求獨(dú)占訪問某種資源時(shí),它們請(qǐng)求互斥對(duì)象的所有權(quán)。因?yàn)樵谀硞€(gè)時(shí)刻只有一個(gè)線程能擁有一個(gè)互斥對(duì)象,其它線程在使用資源前必須等待互斥對(duì)象的所有權(quán)。WaitOne方法引發(fā)一個(gè)調(diào)用線程等待互斥對(duì)象的所有權(quán)。如果擁有互斥對(duì)象的線程正常終止,該互斥對(duì)象的狀態(tài)就被設(shè)置為signaled,下一個(gè)線程獲得它的所有權(quán)。

2.同步事件

同步事件用于通知其它的線程發(fā)生了某種事情或者某種資源可用。不要被它使用了"事件"這個(gè)詞迷惑了。同步事件與其它的VisualBasic事件不同,它是真正的等待句柄。與其它的等待句柄類似,同步事件有兩種狀態(tài)signaled 和nonsignaled。調(diào)用同步事件的某個(gè)等待方法的線程必須等待,直到其它線程調(diào)用Set方法給事件發(fā)信號(hào)。有兩個(gè)同步事件類。線程使用Set方法把ManualResetEvent實(shí)例的狀態(tài)設(shè)置為signaled。線程使用Reset方法或控制返回等待WaitOne調(diào)用把實(shí)例的狀態(tài)設(shè)置為nonsignaled。AutoResetEvent類的實(shí)例也可以使用Set設(shè)置為signaled,但是只要通知等待線程事件變?yōu)閟ignaled,它們自動(dòng)返回到nonsignaled。

下面的例子使用AutoResetEvent類同步線程池事務(wù)。

  1. SubStartTest()  
  2. DimATAsNewAsyncTest()  
  3. AT.StartTask()  
  4. EndSub  
  5. ClassAsyncTest  
  6. PrivateSharedAsyncOpDoneAsNewSystem.Threading.AutoResetEvent(False)  
  7. SubStartTask()DimTpoolAsSystem.Threading.ThreadPoolDimargAsString="SomeArg" 
  8. Tpool.QueueUserWorkItem(NewSystem.Threading.WaitCallback(_AddressOfTask),arg)'對(duì)一個(gè)事務(wù)進(jìn)行排隊(duì)  
  9. AsyncOpDone.WaitOne()'等待該線程調(diào)用SetMsgBox("Threadisdone.")  
  10. EndSubSubTask(ByValArgAsObject)  
  11. MsgBox("Threadisstarting.")  
  12. System.Threading.Thread.Sleep(4000)'等待4秒.  
  13. MsgBox("Thestateobjectcontainsthestring"&CStr(Arg))  
  14. AsyncOpDone.Set()'發(fā)信號(hào)表明該線程完成了  
  15. EndSub  
  16. EndClass 

3.監(jiān)視對(duì)象和同步鎖

監(jiān)視對(duì)象確保代碼塊的運(yùn)行不被運(yùn)行在其它線程中的代碼打斷。換句話說,其它線程中的代碼不能運(yùn)行,直到被同步的代碼塊結(jié)束。在VisualBasic .NET中使用SyncLock關(guān)鍵字來簡(jiǎn)化監(jiān)視對(duì)象的訪問。在VisualC# .NET中使用Lock關(guān)鍵字。

例如,假定你有一個(gè)程序,它重復(fù)地、異步讀取數(shù)據(jù)并顯示結(jié)果。使用優(yōu)先多任務(wù)操作系統(tǒng),正在運(yùn)行的線程可以因?yàn)椴僮飨到y(tǒng)允許其它的線程運(yùn)行而被打斷。如果沒有同步,數(shù)據(jù)正在顯示時(shí),顯示數(shù)據(jù)的對(duì)象被其它的線程修改,有可能得到的是部分更新的數(shù)據(jù)視圖。SyncLock保證一段代碼持續(xù)運(yùn)行,不被打斷。下面的例子顯示了怎樣使用SyncLock給顯示過程提供數(shù)據(jù)對(duì)象的獨(dú)占訪問。

  1. ClassDataObject  
  2. PublicObjTextAsString  
  3. PublicObjTimeStampAsDate  
  4. EndClassSubRunTasks()  
  5. DimMyDataObjectAsNewDataObject()  
  6. ReadDataAsync(MyDataObject)  
  7. SyncLockMyDataObject  
  8. DisplayResults(MyDataObject)  
  9. EndSyncLock  
  10. EndSub  
  11. SubReadDataAsync(ByRefMyDataObjectAsDataObject)'添加異步讀取和處理數(shù)據(jù)的代碼  
  12. EndSubSubDisplayResults(ByValMyDataObjectAsDataObject)'添加顯示結(jié)果的代碼  
  13. EndSub  

Interlocked類

你可以使用Interlocked類的方法防止多個(gè)線程同時(shí)更新或比較同一個(gè)值的問題發(fā)生。這個(gè)類的方法讓你安全地增加、減少、交換和比較來自任何線程的值。下面的例子演示了怎樣使用Increment方法增加一個(gè)運(yùn)行在獨(dú)立線程上的多個(gè)過程共享的變量的值。

  1. SubThreadA(ByRefIntAAsInteger)  
  2. System.Threading.Interlocked.Increment(IntA)  
  3. EndSub  
  4. SubThreadB(ByRefIntAAsInteger)  
  5. System.Threading.Interlocked.Increment(IntA)  
  6. EndSub 

ReaderWriter鎖

在有些情況下,你可能希望只在寫數(shù)據(jù)時(shí)鎖定資源,在數(shù)據(jù)沒有更新完前允許多個(gè)客戶同時(shí)讀數(shù)據(jù)。某個(gè)線程正在修改資源時(shí),ReaderWriterLock類加強(qiáng)了對(duì)該資源的獨(dú)占訪問,但是允許讀取資源的非獨(dú)占訪問。ReaderWriter鎖是排他鎖的一個(gè)有用的備選方案,排他鎖引起其它線程等待,即使這些線程不需要更新數(shù)據(jù)。下面的例子演示了怎樣使用ReaderWriter調(diào)整來自多個(gè)線程的讀和寫操作。

  1. ClassReadWrite  
  2. 'ReadData和WriteData方法可以被多個(gè)線程安全地調(diào)用  
  3. PublicReadWriteLockAsNewSystem.Threading.ReaderWriterLock()  
  4. SubReadData()'這個(gè)過程從數(shù)據(jù)源讀取信息。在允許其它線程調(diào)用ReadData時(shí),讀取鎖放置任何數(shù)據(jù)寫入直到讀取完成  
  5. ReadWriteLock.AcquireReaderLock(System.Threading.Timeout.Infinite)Try'此處執(zhí)行數(shù)據(jù)操作  
  6. FinallyReadWriteLock.ReleaseReaderLock()'釋放讀取鎖  
  7. EndTry  
  8. EndSubSubWriteData()'這個(gè)過程向數(shù)據(jù)源寫信息。寫入鎖防止數(shù)據(jù)被讀取或者寫入知道線程完成寫操作。  
  9. ReadWriteLock.AcquireWriterLock(System.Threading.Timeout.Infinite)Try'此處執(zhí)行寫操作  
  10. FinallyReadWriteLock.ReleaseWriterLock()'釋放寫入鎖  
  11. EndTry  
  12. EndSub  
  13. EndClass 

結(jié)論

多線程處理是可伸縮的、容易響應(yīng)的應(yīng)用程序的關(guān)鍵。VB.NET編程支持加強(qiáng)的、多線程開發(fā)模型,它使開發(fā)者迅速擁有了開發(fā)多線程應(yīng)用程序的能力。
◆VisualBasic .NET使用新的.NET框架組件類,它使建立多線程應(yīng)用程序更容易。
◆記住盡管多線程能提高性能,但是每個(gè)線程有建立線程需要的附加內(nèi)存和保持它運(yùn)行需要的處理器時(shí)間的花消。
◆線程的屬性和方法控制著線程間的交互操作,并且決定什么時(shí)候資源可以給運(yùn)行的線程使用。
◆盡管多線程看起來帶來了混亂,但是你可以使用同步技術(shù)控制正在運(yùn)行的線程。
◆盡管多線程增加了應(yīng)用程序的復(fù)雜性,但是它通過高效率分配可用資源提高了應(yīng)用程序的可伸縮性。

使用本文討論的技術(shù),你可以開發(fā)和處理處理器密集型事務(wù)的專業(yè)應(yīng)用程序。

【編輯推薦】

  1. 簡(jiǎn)單概括VB.NET API函數(shù)
  2. 講述VB函數(shù)之API函數(shù)快速入門
  3. Visual Basic使用對(duì)象全面解析
  4. 全面分析Visual Basic使用技巧
  5. 講解VB.NET語言學(xué)習(xí)經(jīng)驗(yàn)
責(zé)任編輯:田樹 來源: 博客
相關(guān)推薦

2009-10-20 10:23:08

VB.NET多線程編程

2009-11-10 13:08:13

VB.NET編程技巧

2010-01-18 18:06:07

VB.NET多線程

2009-10-23 09:26:09

VB.NET多線程

2009-10-10 16:15:49

VB.NET開發(fā)多線程

2010-01-08 10:48:05

VB.NET多線程

2010-01-11 16:04:10

VB.NET使用wit

2009-10-27 12:20:06

VB.NET多線程應(yīng)用

2009-10-23 17:03:18

VB.NET事件編程

2009-11-02 15:16:07

VB.NET編程

2009-10-12 15:44:26

VB.NET動(dòng)態(tài)編碼技

2010-01-18 18:20:49

VB.NET使用API

2009-10-09 17:01:32

VB.NET多線程

2009-10-20 16:17:37

VB.NET Word

2010-01-14 15:44:17

VB.NET數(shù)據(jù)綁定

2010-01-12 18:00:50

VB.NET界面

2010-01-20 18:51:16

VB.NET修改系統(tǒng)時(shí)

2010-01-08 18:31:45

VB.NET歷史菜單

2010-01-18 18:50:26

VB.NET鼠標(biāo)手勢(shì)

2010-01-15 13:52:42

VB.NET屬性設(shè)置
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)