如何使用 Visual Basic.NET 中的企業服務物件共用

文章翻譯 文章翻譯
文章編號: 317336 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將告訴您,如何建立主控台應用程式,使用 Visual Basic.NET 中的物件集區。您可以開啟及關閉物件集區來查看物件集區會如何影響應用程式,會建立許多昂貴的物件。

需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • Microsoft.NET 架構
  • Microsoft Windows 2000 專業版、 Microsoft Windows 2000 Server、 Microsoft Windows XP 或 Microsoft Windows XP 伺服器
本文假設您已熟悉下列主題:
  • 元件物件模型 (COM) 和企業服務
  • 物件共用
  • 使用屬性擴充中繼資料

在 Visual Basic.NET 中建立主控台應用程式

  1. 啟動 Microsoft Visual Studio.NET。
  2. 在 [檔案] 功能表上指向 [新增],然後按一下 [新增專案]。
  3. 在 [新增專案] 對話方塊按一下 [專案類型 下的 [Visual Basic 專案],然後再按一下 [範本] 下方的 [主控台應用程式
  4. 在 [名稱] 文字方塊中輸入 PoolingDemo,],然後再按一下 [確定]]。
  5. 請確定可以看見 [方案總管] 視窗。如果看不到 [方案總管] 中,請按 CTRL + ALT + L 組合鍵。
  6. 請依照下列步驟將參考加入至您要使用的 COM 元件:
    1. 在 [方案總管] 中以滑鼠右鍵按一下 [參考],然後按一下 [加入參考]。
    2. 在 [.NET] 索引標籤上按一下 [可用的元件清單中的 [System.EnterpriseServices,然後按一下 [選取]。請注意 System.EnterpriseServices 出現在 [選取的元件] 清單中。
    3. 按一下 [確定]。請注意 System.EnterpriseServices 出現在主控台應用程式中的 [參考] 節點下方。

將一個 Poolable 和非 Poolable 類別加入至 [專案]

  1. PoolingDemo 在 [方案總管] 上按一下滑鼠右鍵,指向 [新增],然後再按一下 [加入新項目
  2. 在 [加入新項目] 對話方塊 範本,] 下方按一下 [類別],然後按一下 [開啟舊檔]。Class1.vb 建立的預設值,因此包含 poolable 和非 poolable 類別。
  3. 若要存取共用屬性和成員的物件,將下列程式碼加入 Class1.vb 上方:
    Imports System.EnterpriseServices
    					
  4. 使用下列程式碼取代預設類別 1 宣告:
    Public Class Poolable
        Sub New()
            Threading.Thread.Sleep(500)
        End Sub
        Public Sub DoSomething()
            ' Add method contents here.
        End Sub
    End Class
    						
    建構函式所包含的模擬昂貴的作業的程式碼的通知。
  5. 物件必須繼承 ServicedComponent 類別出現在元件服務控制下執行階段。將下列程式碼加入類別宣告之後:
    Inherits ServicedComponent
    					
  6. 如果要讓此類別 poolable,請依照下列步驟執行:
    1. ObjectPoolingAttribute 屬性,與類別檔案的中繼資料儲存旗標為共用在執行階段物件。加入下列程式碼,上述類別宣告,以將 ObjectPoolingAttribute 屬性加入至類別:
      <ObjectPooling(MinPoolSize:=0, MaxPoolSize:=1), JustInTimeActivation(True)>  _  
      							
      注意: 雖然 JustInTimeActivation 屬性不需要啟用集區,您可以在大部份的情況下會使用這個屬性。因為是昂貴建立,並捨棄元件您可以藉由允許重複使用元件執行個體的多個用戶端可大幅改善效能。
    2. CanBePooledServicedComponent 方法預設會傳回 False。使此方法會傳回 True,請覆寫 CanBePooled 方法,加入下列程式碼:
      Protected Overrides Function CanBePooled() As Boolean
              Return True
          End Function
      						
  7. 將下列程式碼加入至非 poolable 類別:
    Public Class NonPoolable
        Inherits ServicedComponent
        Sub New()
            ' Simulate an expensive operation.
            Threading.Thread.Sleep(500)
        End Sub
        Public Sub DoSomething()
            ' Add method contents here.
        End Sub
    End Class
    					

修改 Module1.vb 來建立這些類別的多個執行個體

  1. 在 [程式碼編輯器] 視窗中按一下 [Module1.vb] 索引標籤。
  2. 在檔案頂端加入 EnterpriseServices 命名空間,以允許存取 DisposeObject 方法下的面的 Imports 陳述式:
    Imports System.EnterpriseServices
    						
    DisposeOjbect 方法會傳回物件的物件集區可以讓這些人員重複使用。
  3. 新增下列 Sub Main 程序:
    Sub Main()
            Dim StartTime As DateTime = DateTime.Now
            Dim i As Int32
    
            Const Iterations As Int16 = 50
            For i = 1 To Iterations
                Dim D As New NonPoolable()
    
                D.DoSomething()
                ServicedComponent.DisposeObject(D)
            Next
    
            Dim EndTime As DateTime = DateTime.Now
            Dim Elapsed As TimeSpan = EndTime.Subtract(StartTime)
            Dim OperationsPerSecond = Iterations / Elapsed.TotalSeconds
    
            Console.WriteLine("Object Creations / Second = " & OperationsPerSecond)
            System.Console.ReadLine()
    End Sub
    						
    這個程式碼會設定在每個 50 的反覆項目期間建立 NonPoolablePoolable 類別的執行個體的迴圈。程式碼會記錄開始,然後結束時間迴圈和再寫入至主控台每秒建立的物件數目。

產生組件強式名稱

您必須產生這個專案會產生組件的強式名稱。沒有強式名稱無法使用 COM + 服務註冊此組件。

若要產生這個密碼編譯金鑰組,使用 [位於.NET Framework 軟體開發套件 (SDK) 的安裝位置的 Bin 資料夾中的 [強式名稱 (Sn.exe)] 工具]。使用下列命令列語法來執行 Sn.exe 工具:
sn-k drive letter \ DirectoryToPlaceKey \ KeyName.snk
  1. 若要開啟 Visual Studio.NET 命令提示字元、 按一下 [開始]、 指向 [程式集]、 指向 [Microsoft Visual Studio.NET、 指向 Visual Studio.NET 工具,然後按一下 [Visual Studio.NET 命令提示字元
  2. 在命令提示字元下輸入下列命令:
    sn-k drive letter: \ Project Root Folder \poolkey.snk
  3. 按下 ENTER 鍵來產生金鑰組。請注意下列的訊息會出現在 [命令] 視窗中:
    寫入金鑰組...
  4. 若要將此機碼與專案的組件產生關聯,按兩下 AssemblyInfo.vb 在 [方案總管] 中。依預設值,Visual Studio.NET 包含組件屬性在這個檔案中當您建立的專案。將下列程式碼加入至這個組件屬性的清單:
    <Assembly: AssemblyKeyFile("..\..\poolkey.snk")>
    					

完整的程式碼清單

Class1.vb

Imports System.EnterpriseServices

<ObjectPooling(MinPoolSize:=0, MaxPoolSize:=1), JustInTimeActivation(True)>  _
Public Class Poolable
    Inherits ServicedComponent
    Sub New()
        ' Simulate an expensive operation.
        Threading.Thread.Sleep(500)
    End Sub

    Public Sub DoSomething()
        ' Add method contents here.
    End Sub

    Protected Overrides Function CanBePooled() As Boolean
        Return True
    End Function
End Class

Public Class NonPoolable
    Inherits ServicedComponent
    Sub New()
        ' Simulate an expensive operation.
        Threading.Thread.Sleep(500)
    End Sub

    Public Sub DoSomething()
        ' Add method contents here.
    End Sub
End Class
				

Module1.vb

Imports System.EnterpriseServices

Module Module1

    Sub Main()
        Dim StartTime As DateTime = DateTime.Now
        Dim i As Int32

        Const Iterations As Int16 = 50
        For i = 1 To Iterations
            'Dim D As New Poolable()
            Dim D As New NonPoolable()

            D.DoSomething()
            ' To return the object to the object pool, use DisposeObject.
            ' This allows the object to be reused from the pool. If you do not call
            ' DisposeObject, the garbage collector does not collect this object, 
            ' and the object is not reused from the object pool.
            ServicedComponent.DisposeObject(D)
        Next

        Dim EndTime As DateTime = DateTime.Now
        Dim Elapsed As TimeSpan = EndTime.Subtract(StartTime)
        Dim OperationsPerSecond = Iterations / Elapsed.TotalSeconds

        Console.WriteLine("Object Creations / Second = " & OperationsPerSecond)
        ' Pause until the user presses ENTER.
        System.Console.ReadLine()
    End Sub

End Module
				

AssemblyInfo.vb

Imports System.Reflection
Imports System.Runtime.InteropServices

' The following set of attributes control general information about an assembly. 
' Change these attribute values to modify the information that is associated with an assembly.

' Review the values of the assembly attributes.

<Assembly: AssemblyTitle("")> 
<Assembly: AssemblyDescription("")> 
<Assembly: AssemblyCompany("")> 
<Assembly: AssemblyProduct("")> 
<Assembly: AssemblyCopyright("")> 
<Assembly: AssemblyTrademark("")> 
<Assembly: CLSCompliant(True)> 
<Assembly: AssemblyKeyFile("..\..\poolkey.snk")> 

'The following GUID is for the ID of the TypeLib if you expose this project to COM.
<Assembly: Guid("30324ED6-329C-4B12-BDA2-8E817F1E2079")> 

' Version information for an assembly consists of the following four values:
'
'      Major Version
'      Minor Version 
'      Build Number
'      Revision
'
' You can specify all of these values, or you can use the asterisk (*) for
' the Build Number and the Revision values.

<Assembly: AssemblyVersion("1.0.*")>
				

請確認它可以運作

  1. 按下 F5 鍵以在偵錯模式中執行應用程式。 請注意這會建立 NonPoolable 類別的執行個體。
  2. 等候約 25 秒。請注意會出現下列訊息:
    物件之建立/秒 = 1.73542243764044
    注意: 每秒建立的確切數目可能會有所不同。
  3. 請按下 ENTER 結束主控台應用程式,並回到 [Visual Studio.NET。
  4. 修改 Module1.vb 來建立 Poolable 類別的執行個體。變更 Sub Main 程序中的第一行,如下所示:
    Dim D As New Poolable()
    					
  5. 請按 F5 再次執行應用程式。
  6. 等候數秒鐘的時間。請注意,在出現下列訊息 (或類似):
    物件之建立/秒 = 29.1977213631085
    請注意顯著的改進的效能,當您使用物件集區。
  7. 請按下 ENTER 結束主控台應用程式,並回到 [Visual Studio.NET。

疑難排解

不要忘記 CanBePooled 會覆寫。如果您省略這個步驟,無法集區物件。

參考

如需有關如何實作及部署 COM + 設定類別藉由使用共通的語言執行階段、 如何存取物件內容,並呼叫內容,以及如何管理內容相對物件參考,請參照到下列 Microsoft 網站:
COM + 整合: 如何.NET 企業服務可以幫助您建置分散式應用程式
http://msdn.microsoft.com/en-us/library/bb985615.aspx

屬性

文章編號: 317336 - 上次校閱: 2004年7月15日 - 版次: 4.4
這篇文章中的資訊適用於:
  • Microsoft .NET Framework Class Libraries 1.0
  • Microsoft Enterprise Services (included with the .NET Framework) 1.0
  • Microsoft Visual Basic .NET 2002 Standard Edition
關鍵字:?
kbmt kbhowtomaster KB317336 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:317336
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com