使用 PerWebRequest 创建的某些对象在 Web 请求结束时不会被垃圾回收
注册
public class a : IDisposable
{
public static int counter;
public a()
{
counter++;
}
~a()
{
counter--;
}
public void Dispose()
{
}
}
后:
application_container = new WindsorContainer( );
application_container.Register( Component.For<a>( ).ImplementedBy<a>( ).LifeStyle.PerWebRequest );
web.config 中的正确内容:
<add name="PerRequestLifestyle"
type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule,
Castle.MicroKernel"/>
使用从 SVN 构建的 Castle 版本。 使用网页代码:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
GC.Collect( 2 );
var a = Global.application_container.Resolve<Global.a>();
Response.Write( Global.a.counter.ToString() );
}
}
我知道 ~a() 未被调用,并且 RedGate 分析器显示 a 未被调用 正在收集,对其的引用卡在 AllComponentsReleasePolicy.instance2burden。
我不是第一个遇到此问题的人
Given
public class a : IDisposable
{
public static int counter;
public a()
{
counter++;
}
~a()
{
counter--;
}
public void Dispose()
{
}
}
With registration:
application_container = new WindsorContainer( );
application_container.Register( Component.For<a>( ).ImplementedBy<a>( ).LifeStyle.PerWebRequest );
Proper stuff in web.config:
<add name="PerRequestLifestyle"
type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule,
Castle.MicroKernel"/>
Using version of Castle built from SVN.
With web page code:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
GC.Collect( 2 );
var a = Global.application_container.Resolve<Global.a>();
Response.Write( Global.a.counter.ToString() );
}
}
I get that ~a() is not called and RedGate profiler shows that a is not
being collected, the reference to it stuck in
AllComponentsReleasePolicy.instance2burden.
I am not the first one to encounter this problem
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我们在 2.1 中发现了类似的问题,似乎已经修复了,升级应该可以修复它。
We found a similar issue in 2.1, seems to have been fixed along the way, upgrading should fix it.