我是否需要处置与应用程序本身具有相同生存期的IDisposable?

时间:2019-05-14 14:11:05

标签: c# .net .net-core idisposable

我有一个IDiposable对象,该对象“永远”存在于应用程序中。在我的情况下是SemaphoreSlim,但问题实际上适用于任何可以处置的物体。

我肯定知道只要应用程序运行,我就需要一个对象。所以问题是:在流程结束时,我是否真的需要确保将其处置或释放所有非托管资源? (如果需要的话,Windows和Linux都可以。)

处置的问题是,我的信号量在堆栈中很深,从理论上讲,这意味着我的整个对象堆栈都必须实现IDisposable,因为某个地方确实没有需要处置的信号量。

我想避免但不确定后果。

2 个答案:

答案 0 :(得分:1)

  

我有一个IDiposable对象,该对象“永久”存在于应用程序中

那么,如果它必须生存到应用程序生命周期,那么处置的问题在哪里呢?而是在应用程序结束或回收时的运行时释放它。

  

该过程结束后,所有非托管资源都将被释放吗?

是的,一旦您的应用程序结束(进程结束),它们就可以释放出来,但是直到那时资源才坐在那里,占用了内存(但这就是您的要求)

答案 1 :(得分:1)

所有OS级别的对象在进程终止时被释放。这是由OS保证的,对于Windows和Linux操作系统都是如此。此外,具有正确实现的处置方式的IDispisable具有故障保护机制,该机制可确保在定稿过程中回收非托管资源。但是,此过程有一些局限性(特别是要给终结器以有限的时间完成)。因此,在最坏的情况下,您可以确保不受管理的资源不会超过您的流程。当然,最好不要让它们无人看管,因为在系统忽略资源回收的情况下,这可能会导致资源和内存泄漏,但对于寿命等于应用程序生存期的单个资源,这是例外情况,可以接受。