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

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

317336
本文已归档。它按“原样”提供,并且不再更新。
概要
本文演示了如何创建一个控制台应用程序,它使用对象池在 Visual Basic.net 中。您可以打开和关闭对象以查看对象池是如何影响创建很多昂贵的对象的应用程序池。

back to the top

要求

下面的列表概述了建议的硬件、 软件、 网络的基础结构和服务包,您需要:
  • microsoft.net 框架
  • Microsoft Windows 2000 专业版、 Microsoft Windows 2000 Server、 Windows XP 专业,或 Windows XP 服务器
本文假定您熟悉下列主题:
  • 组件对象模型 (COM) 和企业服务
  • 对象池
  • 使用属性扩展元数据
back to the top

在 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 会出现在控制台应用程序中的 引用 节点下。
back to the top

向项目添加一个 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 SubEnd 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 SubEnd Class					
back to the top

修改 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 类的实例。该代码记录开始和结束时间为循环并写入的每秒到控制台创建的对象数。
back to the top

生成程序集的强名称

您必须生成此项目将生成的程序集的强名称。没有一个强名称不能注册此程序集使用 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")>					
back to the top

完整代码列表

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 FunctionEnd ClassPublic Class NonPoolable    Inherits ServicedComponent    Sub New()        ' Simulate an expensive operation.        Threading.Thread.Sleep(500)    End Sub    Public Sub DoSomething()        ' Add method contents here.    End SubEnd Class				
back to the top

Module1.vb

Imports System.EnterpriseServicesModule 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 SubEnd Module				
back to the top

AssemblyInfo.vb

Imports System.ReflectionImports 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.*")>				
back to the top

验证它工作的

  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。
back to the top

故障排除

不要忘记重写 CanBePooled。如果省略了这一步您不能池对象。

back to the top

引用

有关如何实现和部署的详细信息 COM + 配置类使用公共语言运行库、 如何访问对象上下文和调用上下文,以及如何管理相对于上下文的对象引用,请参阅以下 Microsoft 网站来:
COM + 集成: 如何.net 企业级服务可以帮助您生成分布式应用程序
http://msdn.microsoft.com/en-us/library/bb985615.aspx
back to the top

警告: 本文已自动翻译

属性

文章 ID:317336 - 上次审阅时间:01/11/2015 04:32:51 - 修订版本: 4.4

  • Microsoft .NET Framework Class Libraries 1.0
  • Microsoft Enterprise Services (included with the .NET Framework) 1.0
  • Microsoft Visual .NET 2002 标准版
  • kbnosurvey kbarchive kbmt kbhowtomaster KB317336 KbMtzh
反馈