我在Web应用程序中遇到如下情况。我只想检查它是一个好模式。可能发生的事情意味着我的字典是腐败的(有些成员被处置,有些成员没有,例如)?我是否正确实施了这个想法?
static IDictionary<string, IDisposable>() _map;
Application_Start()
{
if (_map == null)
{
_map = new IDictionary<string, IDisposable>();
_map.Add(...);
_map.Add(...);
}
}
Application_End
{
if (_map != null)
{
foreach (var m in _map)
{
m.Value.Dispose();
}
_map = null;
}
}
答案 0 :(得分:5)
我看到以下问题:
在应用程序的运行时期间从地图中删除对象不会将其丢弃。您必须手动执行此操作。替换地图中的对象也是如此。
<强>更新强>
以下内容将留下未曝光的对象:
_map[key] = new DisposableObject();
以前由key
识别的对象永远不会被处置。
关于整个概念:
它没有多大意义。 .NET运行时会在应用程序退出时释放所有内存。因此,只要应用程序本身似乎不需要,就可以在对象上实现IDisposable
,除非它们持有对非托管资源(如打开文件句柄)的引用。
答案 1 :(得分:2)
除了其他人所说的内容之外,没有什么可以阻止某人在你的词典中的某个对象上调用Dispose
- 所以你很容易混合处置和未处置的对象。
当然,如果你正确地实现IDisposable
(即对象检查它是否被处置)那么它可能不会(但可能会)过早地处理对象......
我无法看到这样做是有意义的,处理事情因为应用程序结束并不会真正为你买任何东西,因为你已经过了关心持有非托管资源的问题。 IDisposable
更多的是关于尽快释放非托管资源。更多的头脑可能会纠正我,但我很确定一旦你的应用程序被卸载,操作系统就会释放非托管资源。