在Windows服务停止之前是否应丢弃一次性对象?

Nei*_*rao 8 c# dispose

这个线程,Dispose()必须显式调用一次性对象.

Windows服务停止后会发生什么?这些对象使用的资源是否会自动释放?或者应该在服务停止之前处理它们:

public void Stop()
{
    cancellationTokenSource.Cancel();
    waitForAllTasksToExit();
    cancellationTokenSource.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

"这是一个很好的做法,处理","他们应该在服务停止时被释放"是我的想法.但参考文档是否有具体的答案?

Evk*_*Evk 5

这取决于什么是"这些对象使用的资源".Dispose方法本身不会在进程退出时调用,但大多数包含"非托管"资源的对象除了Dispose还有终结器之外.将在进程退出时调用Finalizer,但可能不会在进程崩溃时调用它.现在,在进程退出(或崩溃)时会发生以下情况:

过程分配的任何资源都将被释放.

所有内核对象都已关闭.

内核对象例如是文件句柄,套接字等.因此,即使进程崩溃并且终结器未运行(或根本没有终结器),操作系统仍将关闭文件或数据库\网络连接等内容.

您可能拥有更广泛的非托管资源定义.非托管意味着不受.NET Framework垃圾收集器管理.例如,如果我在创建某个对象时在磁盘上创建文件,并在放置此对象时删除此文件 - 您可能会说这也是"非托管"资源.操作系统不知道这样的资源,如果我没有实现终结器或者因为进程崩溃而没有调用终结器,它就不会被"清理".

总而言之 - 如果对象实现IDisposable- 甚至在进程退出之前处置它.您可能不知道该对象开发人员的意图,是否有终结器 - 所以最好在进程退出之前始终明确地处理它.