我在我的应用程序中使用 3-rd 方库,其中 GC.Collect() 方法通常被显式调用。
问题是它会产生死锁(这是显式调用 gc 的众所周知的问题)。
如何配置我的应用程序 (app.config) 使其忽略 GC.Collect()?
PS:我知道如何在 Java 中执行此操作(通过使用 -XX:+DisableExplicitGC 标志),
但我不知道如何在 .Net 中执行此操作。
我在我的应用程序中使用 3-rd 方库,其中 GC.Collect() 方法通常被显式调用。
问题是它会产生死锁(这是显式调用 gc 的众所周知的问题)。
如何配置我的应用程序 (app.config) 使其忽略 GC.Collect()?
PS:我知道如何在 Java 中执行此操作(通过使用 -XX:+DisableExplicitGC 标志),
但我不知道如何在 .Net 中执行此操作。
您不能在 C#/.Net 中关闭 GC。
但是,您可以告诉它不要在单独的线程中运行,这可能会对您有所帮助:
http://msdn.microsoft.com/en-us/library/at1stbec%28v=vs.100%29.aspx
但是有没有办法让第三方库的供应商修复他们的烂代码?
我不知道有什么方法可以“忽略”对 GC.Collect() 的调用。有一些可用的配置选项,但我怀疑它们会解决您的死锁问题:
<configuration>
<runtime>
<gcServer enabled="true|false"/>
<gcConcurrent enabled="true|false"/>
</runtime>
</configuration>
它们基本上会切换垃圾收集模式,但不会禁用对 GC.Collect() 的调用。
MSDN:gcServer,gcConcurrent。
我认为调查为什么这会在您的应用程序中产生死锁会更明智。出于某种原因,第 3 方库(哪个库?)可能正在调用 GC.Collect()。也许您可以提供更多详细信息?