我有一个“context”对象,它与HttpContext.Items通过静态电流特性。这个对象可以通过表达式生成器和控件直接使用,它们都是同一个库的一部分。
full disposable pattern (使用finalizer),但不能及时依赖GC定案实例。
我试图订阅一个静态方法HttpApplication.EndRequest(也可以是PostRequestHandlerExecute)在objects构造函数中(通过锁定来确保它只发生一次),但从不调度事件。这大概是因为HttpApplication的实例发生了变化,尽管我不完全确定。
有什么解决这个问题的最佳方法吗?
向静态事件订阅请求将导致内存泄漏。它阻止请求开始garage collected,因为它包含对HttpApplication的引用。
HttpContext.Items 你需要在请求结束时这样做。如果不想使用HttpModule,请使用全局.ascx然后钩住 EndRequest
HttpContext.Items
EndRequest
void Global_EndRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; var disposableItem = app.Context.Items["disposableItem"] as IDisposable; if (disposableItem != null) { disposableItem.Dispose(); } }