如何使用 Visual Basic.net 中的企业服务对象池

文章翻译 文章翻译
文章编号: 317336 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文演示了如何创建一个控制台应用程序,它使用对象池在 Visual Basic.net 中。您可以打开和关闭对象以查看对象池是如何影响创建很多昂贵的对象的应用程序池。

要求

下面的列表概述了建议的硬件、 软件、 网络的基础结构和服务包,您需要:
  • microsoft.net 框架
  • Microsoft Windows 2000 专业版、 Microsoft Windows 2000 Server、 Windows XP 专业,或 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. 使用下面的代码替换默认的 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. 若要使此类 poolable,请按照下列步骤操作:
    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. 将下面的代码添加到非 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. 在文件顶部添加以下的 Imports 语句,以允许访问 DisposeObject 方法 EnterpriseServices 命名空间:
    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 + 服务。

若要生成此加密的密钥对,使用 $ 在 Bin 文件夹中,在安装.net 框架软件开发工具包 (SDK) 位于强名称 (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 .NET 2002 标准版
关键字:?
kbmt kbhowtomaster KB317336 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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