如果我在调试模式下调用Dispose
,为什么我的DbContext没有处理?
在发布模式下,一切正常,但在Debugmode中,我在循环的每次迭代中看到内存增加,永远不会释放。
我使用了工具 dotMemory 来确保它来自_db
。
如果我在_db = null;
_db.Dispose();
,它就有效
我有这个基类:
public abstract class SomeBase : IDisposable
{
private MyDbContext _db;
public abstract void Process();
protected KassenautomatEntities Db
{
get { return _db ?? (_db = new MyDbContext); }
}
public void Dispose()
{
if (_db != null)
{
_db.Dispose();
_db = null; //Without this, theContext does not get Disposed in Debug Mode
}
}
}
然后我使用以下方法获取从SomeBase
继承的所有类的实例:
public static IEnumerable<T> EnumeratedObjectsOfType<T>(params object[] constructorArgs) where T : class
{
return EnumerateTypesOfType<T>().Select(type => (T) Activator.CreateInstance(type, constructorArgs));
}
public static IEnumerable<Type> EnumerateTypesOfType<T>() where T : class
{
return Assembly.GetAssembly(typeof(T))
.GetTypes()
.Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(T)));
}
并循环处理:
private static void Main()
{
var someArray= ReflectionUtility.EnumeratedObjectsOfType<SomeBase>().ToArray();
for (var i = 0; i < someArray.Length; i++)
{
someArray[i].Process();
someArray[i].Dispose();
someArray[i] = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
Console.ReadKey();
}
那么,为什么我需要将'_db'设置为null? someArray[i] = null;
上不应该自动丢失参考文献吗?