使用语句/调用在静态方法中使用

pwn*_*ess 1 .net c# parallel-processing memory-leaks entity-framework

我正在开发一个包含静态方法的实用程序类,这些方法经常被多个线程调用.我注意到内存使用随着时间的推移而增长,所以在我看来我有一些内存泄漏.

这是我用于这些静态方法的模式的一个简单示例:

public static int CreateNewThing(int IDofSomeDBObjectHoldingInfoToCreateNewThing)
{
    using(SomeDBContext context = new SomeDBContext(connectionString))
    {
        SomeDBObjectHoldingInfoToCreateNewThing createNewThingyInfo = context.SomeDBObjectsHoldingInfoToCreateNewThing.First(obj => obj.ID == IDofSomeDBObjectHoldingInfoToCreateNewThing);
        // Do some stuff to create the new object
        // Return the ID of the newly created thingy...
        return theNewThingThatWasCreated.ID;
     }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,使用'using'语句或直接调用静态方法中的Dispose实际上是否清除了任何内存.当然,我没有说明这个应用程序的整体架构或目的,但我也想知道我是否在这里使用最好的模式.在.NET中创建线程安全实用程序类的最佳实践是什么?

Jon*_*eet 6

我注意到内存使用随着时间的推移而增长,所以在我看来我有一些内存泄漏.

不一定 - 您需要为我们提供更多数据才能真正了解这一点.

我的问题是,使用'using'语句或直接调用静态方法中的Dispose实际上是否清除了任何内存.

using声明不是关于清理内存.这是GC的工作.他们是关于释放非内存资源.你是否采用静态方法与是否SomeDBContext应该被处置完全无关.


Ser*_*rvy 5

我的问题是,使用'using'语句或直接调用静态方法中的Dispose实际上是否清除了任何内存

using只是一种更简单的通话方式Dispose.

using(MyClass obj = new MyClass())
{

}
Run Code Online (Sandbox Code Playgroud)

和写作一样:

MyClass obj;
try
{
    obj = new MyClass()
}
finally
{
    ((IDisposable)obj).Dispose();
}
Run Code Online (Sandbox Code Playgroud)

接下来,Dispose释放内存.不,它没有.Dispose旨在释放无法清理的非托管资源,然后垃圾收集器释放此对象的内存.它实际上并没有更快地释放对象的内存.需要处理的常见事情是网络连接(如这里的情况)文件句柄,通过与另一种语言交互创建的非托管内存等.

那么,为什么你的记忆力会上升.简而言之,这只是通常的行为.您正在创建对象,他们正在使用内存,因此您的记忆力正在增加.在某些时候,垃圾收集器将确定它需要执行一个集合来释放一些内存.(可能是因为系统运行不足而且需要更多,可能是因为它已经足够长了,或者C#语言指定的任何其他条件.当真正需要集合时,它几乎总是比你更清楚.)

所以,除非你有一个真正的问题,不要担心,这是托管语言中的正常行为.如果你开始耗尽内存,或者即使收集确实发生了内存也没有关闭,那么你需要开始寻找问题.