使用语句 /呼叫在静态方法中处置



我正在开发一个效用类,其中包含静态方法,该方法经常由多个线程调用。我注意到记忆使用随着时间的推移正在增长,所以在我看来我有一些内存泄漏。

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

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;
     }
}

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

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

不一定 - 您需要给我们更多数据才能真正有一个很好的想法。

我的问题是,使用"使用"语句或直接调用静态方法内部distose实际上清除了任何内存。

using语句不是要清理内存。那是GC的工作。他们是要发布 nonmemory 资源。无论您是否使用静态方法,与是否应该处置SomeDBContext完全无关。

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

using只是调用 Dispose的句法方法。

using(MyClass obj = new MyClass())
{
}

与写作相同:

MyClass obj;
try
{
    obj = new MyClass()
}
finally
{
    ((IDisposable)obj).Dispose();
}

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

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

因此,除非您有一个真正的问题,否则不用担心,这是托管语言的正常行为。如果您开始用完内存,或者即使发生收集 do 也不会下降,则需要开始寻找问题。

最新更新