![]() |
1
2
从技术上讲,这完全取决于IDisposable所做的工作。它被用于很多事情,而不仅仅是非托管资源。 例如,在使用Outlook应用程序时,我构建了一个很好的Outlook API抽象。作为流处理的附件尤其烦人,因为您需要将其保存到一个临时文件中,使用它,然后清理它。 所以我的抽象是这样的:
对AttachmentStream调用Dispose时,它所基于的临时文件被删除。在这种情况下,如果不调用Dispose,则不会清除临时文件。我在启动时有一个过程来查找这些孤立的文件,但我想我会举个例子来说明这一点。 实际上,在进程终止时,操作系统只需清理几乎所有包装了某种套接字、句柄或事务的IDisposable实现。但很明显这就像福利。如果可以的话就避免。 |
![]() |
2
2
在合作关闭期间,将卸载AppDomain,这将导致所有终结器执行: 从 Object.Finalize 文档:
因此,只要满足以下两个标准,您就可以安全关机:
如果不满足这两个条件中的任何一个,您的应用程序可能会保持
全球的
非托管资源(如互斥体),实际上会泄漏。因此,最好打电话
|
![]() |
3
1
我经常发现自己处理的一件事是串行端口——现在,当程序启动时,串行端口应该被释放,而其他程序在被另一个进程持有时不能访问串行端口。所以,如果您的进程拒绝死亡,那么您就是在捆绑一个串行端口。如果用户试图重新启动您的程序,但前一个进程的僵尸版本仍然保留在串行端口上,这可能非常糟糕。 是的,我以前让我的程序发现自己处于僵尸状态,然后客户抱怨程序不再工作,因为程序重新启动时无法连接到串行端口。结果要么引导用户完成任务管理器中进程的终止,要么让他们重新启动,这两项任务都不是特别用户友好的任务。 |
![]() |
4
0
编写自定义代码以释放可释放类中的对象。您可以编写代码来释放非托管和托管代码。
这就是为什么我们需要
现在,如果你认为非托管代码是由操作系统自动释放的,那就不是真的了。如果应用程序没有正确地处理,那么有许多句柄和锁可能仍然处于活动状态。 |
![]() |
5
0
首先,我想指出
举个小例子,给你一个想法:
注意这个
因此,您不能指望Windows在您之后清理内核对象。可能还有一些东西连窗户都不知道。 但是,也就是说,如果您的可释放对象被正确地写入(即在终结器中调用Dispose),那么在进程退出时,它们仍将由clr处理。
所以,答案是:是的,不需要打电话
编辑 正如JoshEinstein正确指出的,终结器实际上并不能保证在进程退出时运行。那么答案就变成: 总是打电话给Dispose,只是为了起诉 |
![]() |
CalculusLover · 在本例中,fork()是如何工作的? 3 年前 |
![]() |
jjmerelo · 使用Proc::Async从绑定管道读取 7 年前 |
![]() |
jatinBatra · 编译后生成的二进制文件会发生什么情况[关闭] 7 年前 |
![]() |
Jacobo · 从Java调用具有输入和输出重定向的C可执行文件 7 年前 |
![]() |
Ran · 每当我尝试执行命令行提示符时,Unity就会阻塞 7 年前 |
![]() |
Hatshepsut · 使用命令行参数使用region调用子流程 7 年前 |