无法从管理的客户端
我已经暴露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
非常感谢您的回复。我采用了与你在这里描述的方式相同的方式实现,它似乎工作正常。 – sveerap 2011-06-09 13:09:13