无法从管理的客户端

问题描述:

我已经暴露C#DLL作为.NET服务组件(COM +)释放.NET服务组件对象(COM +)的存储器中。它正在被一个无人管理的客户(Unify Vision)消耗。我已经在组件服务中部署了这个组件。无法从管理的客户端

我设置了池大小为5,2分钟的创建时间了。我在服务器模式下运行com +。并将空闲关机时间设置为3分钟。

一切工作正常,但一旦最大池大小达到(5),该过程没有得到清理活着。由于这个原因,如果我试图创造一个更多的对象,它的失败和挂起。

似乎对象不会被消费者发布。这个服务组件公开了两种方法_Destroy和Dispose。一旦使用它,我必须使用哪一个来释放对象。另外,在调用这些方法之后,对象是否会立即释放。有什么方法可以找出对象有多少个引用?

而且,我需要使用像JIT和设置自动完成属性什么?我已经尝试过这个选项。

我不确定对象是否被释放回池中。如何跟踪这个?

请帮

感谢 sveerap

有两种方法_destroy和 处置该暴露的服务 组件。一旦使用它,我必须使用哪一个来释放对象。

由于您正在处理服务器(out of process)应用程序,客户端不应该调用Dispose()。如果你的组件配置正确,那么dispose实际上就是创建/激活一个新实例来调用Dispose方法。在文章Understanding Enterprise Services (COM+) in .NET中阅读关于Object Lifetimes的全文。

将在对这些 方法的调用之后立即释放对象 。

是的,这将返回到池中。

有没有什么办法可以找出有多少 参考对象?

使用COM +资源管理器查看应用程序中的所有组件。将视图设置为状态,您将看到对象的数量,激活对象的数量,池中对象的数量和通话时间。

而且,我需要用什么样 JIT和设置自动完成 属性?尽管我已经尝试了这个 选项。

是的,您将不得不使用JIT并致电ContextUtil.DeactivateOnReturn = true;

我不知道对象是否被释放回池中是否有 。 如何跟踪此?

您可以重写Activate和Deactivate方法,以查看组件何时从池中移除并释放回池中。

下面是一个有1个对象的最大数量池,但返回实例的方法调用后立即池中的一个例子:如果你被多个客户端调用Hello方法同时

using System; 
using System.EnterpriseServices; 
using System.Runtime.InteropServices; 

namespace ClassLibrary1 
{ 
    [ComVisible(true)] 
    [EventTrackingEnabled(true)] 
    [JustInTimeActivation(true)] 
    [ObjectPooling(CreationTimeout=60000, 
        Enabled=true, MaxPoolSize=1, MinPoolSize=0)] 
    public class Class1 : ServicedComponent 
    { 
     public Class1() 
     { 
     } 

     public string Hello() 
     { 
      System.Diagnostics.Trace.TraceInformation("Call Hello"); 

      // We are done after this call so return this instance to the pool 
      ContextUtil.DeactivateOnReturn = true; 

      return "world"; 
     } 

     // Get an instance from the pool 
     protected override void Activate() 
     { 
      System.Diagnostics.Trace.TraceInformation("Activated"); 
      base.Activate(); 
     } 

     // Return an instance to the pool 
     protected override void Deactivate() 
     { 
      System.Diagnostics.Trace.TraceInformation("Deactivate"); 
      base.Deactivate(); 
     } 

     // Runtime will call Dispose after method call (with disposing = true) 
     protected override void Dispose(bool disposing) 
     { 
      System.Diagnostics.Trace.TraceInformation("Disposing = " + disposing); 
      base.Dispose(disposing); 
     } 

    } 
} 

不释放客户端对象,你会看到该方法不会阻塞(除了调用的持续时间),因为在Hello方法返回后对象被释放回池中。使用DebugView查看调用序列。这里有2个客户在打电话给你之后立即与一个睡眠同时打电话。

00000001 0.00036997 [6068] Activated  
00000003 0.00160919 [6068] Call Hello 
00000005 0.00493093 [6068] Deactivate 
00000007 0.00567035 [6068] Disposing = True  
00000009 0.14866389 [6068] Activated  
00000011 0.14876986 [6068] Call Hello 
00000013 0.14885986 [6068] Deactivate 
00000015 0.14896829 [6068] Disposing = True  
+0

非常感谢您的回复。我采用了与你在这里描述的方式相同的方式实现,它似乎工作正常。 – sveerap 2011-06-09 13:09:13