HOWTO: Visual Basic .NET에서 Enterprise Services 개체 풀링 사용

기술 자료 번역 기술 자료 번역
기술 자료: 317336 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 Visual Basic .NET에서 개체 풀링(Object Pooling)을 사용하는 콘솔 응용 프로그램을 만드는 방법을 설명합니다. 개체 풀링을 설정 및 해제하여 비용이 많이 드는 여러 개체를 만드는 응용 프로그램에 개체 풀링이 어떠한 영향을 미치는지 확인할 수 있습니다.

요구 사항

다음은 권장되는 하드웨어, 소프트웨어 및 네트워크 인프라와 필요한 서비스 팩의 목록입니다.
  • Microsoft .NET Framework
  • Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows XP Professional 또는 Microsoft Windows XP Server
이 문서에서는 사용자가 다음 내용을 잘 알고 있는 것으로 가정합니다.
  • 구성 요소 개체 모델(COM) 및 Enterprise Services
  • 개체 풀링
  • 특성을 사용하여 메타데이터 확장

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가 콘솔 응용 프로그램의 참조 노드에 나타납니다.

프로젝트에 풀링이 가능한 클래스 및 풀링이 가능하지 않은 클래스 추가

  1. 솔루션 탐색기에서 PoolingDemo를 마우스 오른쪽 단추로 누르고 추가를 가리킨 다음 새 항목 추가를 누릅니다.
  2. 새 항목 추가 대화 상자의 템플릿에서 클래스를 누른 다음 열기를 누릅니다. Class1.vb가 기본적으로 만들어지고 풀링이 가능한 클래스 및 풀링이 가능하지 않은 클래스 모두를 포함합니다.
  3. 개체 풀링 특성 및 구성원에 액세스하려면 Class1.vb 맨 위에 다음 코드를 추가합니다.
    Imports System.EnterpriseServices
    					
  4. 기본 Class1 선언을 다음 코드로 대체합니다.
    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. 이 클래스를 풀링이 가능하게 하려면 다음과 같이 하십시오.
    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. 풀링이 가능하지 않은 클래스에 다음 코드를 추가합니다.
    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 네임스페이스에 대해 다음 Imports 문을 추가하여 DisposeObject 메서드에 액세스할 수 있게 합니다.
    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회 반복하는 동안 NonPoolable 또는 Poolable 클래스의 인스턴스를 만드는 루프를 설정합니다. 이 코드는 루프의 시작 및 종료 시간을 기록한 다음 콘솔에 초 당 만들어지는 개체 수를 기록합니다.

어셈블리의 강력한 이름 생성

이 프로젝트가 생성하는 어셈블리의 강력한 이름을 생성해야 합니다. 강력한 이름이 없으면 COM+ 서비스를 사용하여 이 어셈블리를 등록할 수 없습니다.

이 암호화 키 쌍을 생성하려면 .NET Framework SDK(Software Development Kit)가 설치된 Bin 폴더에 있는 강력한 이름(Sn.exe) 도구를 사용합니다. 다음 명령줄 구문을 사용하여 Sn.exe 도구를 실행합니다.
sn -k drive letter\DirectoryToPlaceKey\KeyName.snk
  1. Visual Studio .NET 명령 프롬프트를 열려면 시작을 누르고 프로그램, Microsoft Visual Studio .NET, Visual Studio .NET Tools를 차례로 가리킨 다음 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초 동안 기다리십시오. 다음 메시지가 나타납니다.
    Object Creations / Second = 1.73542243764044
    참고: 초 당 정확하게 만들어지는 수는 다양합니다.
  3. Enter 키를 눌러 콘솔 응용 프로그램을 종료하고 Visual Studio .NET으로 돌아갑니다.
  4. Module1.vb를 수정하여 Poolable 클래스의 인스턴스를 만듭니다. 다음과 같이 Sub Main 프로시저에서 첫번째 줄을 변경합니다.
    Dim D As New Poolable()
    					
  5. F5 키를 눌러 응용 프로그램을 다시 실행합니다.
  6. 잠시 기다려 주십시오. 다음과 유사한 메시지가 나타납니다.
    Object Creations / Second = 29.1977213631085
    개체 풀링을 사용할 때 성능이 매우 향상되었는지 확인합니다.
  7. Enter 키를 눌러 콘솔 응용 프로그램을 종료하고 Visual Studio .NET으로 돌아갑니다.

문제 해결

CanBePooled를 반드시 재정의하십시오. 이 단계를 생략하면 개체를 풀링할 수 없습니다.

참고

공용 언어 런타임을 사용하여 COM+ 구성 클래스를 구현 및 배포하는 방법, 개체 컨텍스트와 호출 컨텍스트에 액세스하는 방법 및 컨텍스트 관련 개체 참조를 관리하는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
COM+ 통합: .NET Enterprise Services의 분산 응용 프로그램 작성 지원 방법
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnmag01/html/complus0110.asp




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 317336 - 마지막 검토: 2003년 8월 21일 목요일 - 수정: 3.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft .NET Framework Class Libraries 1.0
  • Microsoft Enterprise Services (included with the .NET Framework) 1.0
  • Microsoft Visual Basic .NET 2002 Standard Edition
키워드:?
kbhowtomaster KB317336

피드백 보내기

 

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