Как использовать систему Enterprise Services Object Pooling в Microsoft Visual Basic .NET

Переводы статьи Переводы статьи
Код статьи: 317336 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В данной статье описывается процесс создания консольного приложения, использующего накопление объектов, в Visual Basic .NET. Вы можете включить и отключить накопление объектов для того, чтобы увидеть, как влияет накопление объектов на приложение, создающее много ресурсоемких объектов.

Требования

Ниже приведен список рекомендуемого оборудования, программного обеспечения, сетевой инфраструктуры и пакетов обновлений:
  • Microsoft .NET Framework
  • Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows XP Professional или Microsoft Windows XP Server
Примеры в данной статье рассчитаны на пользователя, имеющего достаточный уровень знаний по следующим темам:
  • Component Object Model (COM) и Enterprise Services
  • Object pooling
  • Использование атрибутов для расширения метаданных

Создание консольного приложения в Visual Basic .NET .NET

  1. Запустите Microsoft Visual Studio .NET.
  2. В меню File выберите пункт New и запустите команду New Project.
  3. В диалоговом окне New Project выберите пункт Visual Basic Projects в списке Project Types и выберите пункт Console Application в списке Templates.
  4. В поле Name введите PoolingDemo и нажмите кнопку OK.
  5. Убедитесь, что окно Solution Explorer доступно. Если окно Solution Explorer недоступно, нажмите комбинацию клавиш "CTRL"+"ALT"+"L".
  6. Выполните следующие действия для добавления ссылки на компонент COM, который Вы будете использовать:
    1. В окне Solution Explorer щелкните правой клавишей мыши References и запустите из контекстного меню команду Add Reference.
    2. Перейдите на вкладку .NET, выберите пункт System.EnterpriseServices из списка доступных компонентов и нажмите кнопку Select. Удостоверьтесь в том, что System.EnterpriseServices отображается в списке Selected Components.
    3. Нажмите кнопку OK. Удостоверьтесь в том, что System.EnterpriseServices отображается в узле References приложения.

Добавление группируемого и негруппируемого классов в проект

  1. Щелкните правой кнопкой мыши PoolingDemo в окне Solution Explorer, выберите Add и запустите команду Add New Item.
  2. В диалоговом окне Add New Item выберите элемент Class в списке Templates и нажмите кнопку Open. Class1.vb создается по умолчанию и содержит оба класса - группируемый и негруппируемый.
  3. Для получения доступа к атрибутам и членам группировки объектов добавьте следующий программный код в начало Class1.vb:
    Imports System.EnterpriseServices
    					
  4. Замените объявление класса Class1 по умолчанию следующим программным кодом:
    Public Class Poolable
        Sub New()
            Threading.Thread.Sleep(500)
        End Sub
        Public Sub DoSomething()
            ' Вставьте содержимое метода здесь.
        End Sub
    End Class
    						
    Конструктор содержит программный код, воспроизводящий ресурсоемкую операцию.
  5. Объект должен наследовать класс ServicedComponent для входа под управлением среды выполнения Component Services. Добавьте следующий программный код после объявления класса:
    Inherits ServicedComponent
    					
  6. Для того, чтобы сделать данный класс группируемым, выполните следующие действия:
    1. Атрибут ObjectPoolingAttribute, сохраненный с метаданными файла класса, помечает объект для группировки в среде выполнения. Добавьте следующий программный код перед декларацией класса для добавления атрибута ObjectPoolingAttribute к классу:
      <ObjectPooling(MinPoolSize:=0, MaxPoolSize:=1), JustInTimeActivation(True)>  _  
      							
      Примечание: Хотя атрибут JustInTimeActivation не обязателен для включения накопления, возможно, Вы захотите использовать данный атрибут в большинстве случаев. Так как дорого создавать и отменять компоненты, Вы можете увеличить производительность, позволив нескольким клиентам повторно использовать данные компоненты.
    2. Метод CanBePooledServicedComponent возвращает по умолчанию значение False. Для переопределения метода CanBePooled на возвращение значения True добавьте в программу следующий код:
      Protected Overrides Function CanBePooled() As Boolean
              Return True
          End Function
      						
  7. Добавьте следующий программный код в негруппируемый класс:
    Public Class NonPoolable
        Inherits ServicedComponent
        Sub New()
            ' Воспроизведение ресурсоемкой операции.
            Threading.Thread.Sleep(500)
        End Sub
        Public Sub DoSomething()
            ' Добавьте содержание метода здесь.
        End Sub
    End Class
    					

Изменение Module1.vb для создания нескольких экземпляров этих классов

  1. В окне "Code Editor" перейдите на вкладку Module1.vb.
  2. В начало программного кода добавьте следующий оператор Imports для пространства имен EnterpriseServices, обеспечивающий доступ к методу 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
    						
    Данный программный код реализует цикл, создающий экземпляр класса NonPoolable или Poolable каждые 50 итераций. С помощью данного программного кода выводится время начала и время окончания цикла, а затем - число объектов, созданных за секунду, в консоль.

Генерация строгого имени для сборки

Необходимо сгенерировать строгое имя для сборки, которую сгенерирует данный проект. Без строгого имени невозможно будет использовать COM+ для регистрации данной сборки.

Для генерации данной криптографической пары ключей воспользуйтесь инструментом Strong Name (Sn.exe), расположенным в папке "Bin" основного каталога .NET Framework Software Development Kit (SDK). Используйте следующий синтаксис для запуска утилиты Sn.exe:
sn -k буква диска\DirectoryToPlaceKey\KeyName.snk
  1. Для запуска командной строки Visual Studio .NET нажмите кнопку Пуск, выберите меню Программы, откройте группу программ Microsoft Visual Studio .NET, затем группу Visual Studio .NET Tools и запустите программу Visual Studio .NET Command Prompt.
  2. Введите следующую команду в окне командной строки:
    sn -k буква диска:\Project Root Folder\poolkey.snk
  3. Нажмите клавишу "ENTER" для генерации пары ключей. Должно появиться следующее сообщение в окне командной строки:
    Key pair written to...
  4. Для ассоциирования данного ключа со сборкой проекта дважды щелкните элемент AssemblyInfo.vb в окне Solution Explorer. По умолчанию, 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()
        ' Воспроизведение ресурсоемкой операции.
        Threading.Thread.Sleep(500)
    End Sub

    Public Sub DoSomething()
        ' Добавьте содержание метода здесь.
    End Sub

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

Public Class NonPoolable
    Inherits ServicedComponent
    Sub New()
        ' Воспроизведение ресурсоемкой операции.
        Threading.Thread.Sleep(500)
    End Sub

    Public Sub DoSomething()
        ' Добавьте содержание метода здесь.
    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()
            ' Для возврата объекта в пул объектов используйте DisposeObject.
            ' Это позволяет повторно использовать объект из пула. Если Вы не вызовете
            ' DisposeObject, "сборщик мусора" не соберет данный объект, 
            ' и объект не сможет быть использован повторно из пула объектов.
            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)
        ' Пауза до нажатия пользователем клавиши "ENTER".
        System.Console.ReadLine()
    End Sub

End Module
				

AssemblyInfo.vb

Imports System.Reflection
Imports System.Runtime.InteropServices

' Следующий набор атрибутов контролирует общую информацию о сборке. 
' Измените значения атрибутов для модификации информации, относящейся к сборке.

' Просмотр значений атрибутов сборки.

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

'Следующий GUID предназначен для ID в TypeLib, если Вы открываете данный проект для COM.
<Assembly: Guid("30324ED6-329C-4B12-BDA2-8E817F1E2079")> 

' Информация о версии для сборки состоит из следующих четырех значений:
'
'      Major Version
'      Minor Version 
'      Build Number
'      Revision
'
' Вы можете установить все эти значения или можете использовать звездочку (*) для
' значений Build Number и Revision.

<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+ Integration: How .NET Enterprise Services Can Help You Build Distributed Applications
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnmag01/html/complus0110.asp

Свойства

Код статьи: 317336 - Последний отзыв: 4 марта 2003 г. - Revision: 1.0
Информация в данной статье применима к:
  • Microsoft .NET Framework Class Libraries 1.1
  • Microsoft .NET Framework Service Pack 2
  • Microsoft Visual Basic .NET 2002 Standard Edition
Ключевые слова: 
kbhowto 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