gpt4 book ai didi

c# - 使用 GC.AddMemoryPressure 触发更频繁的 Runtime Callable Wrapper (RCW) 终结是否合适?

转载 作者:太空宇宙 更新时间:2023-11-03 10:31:35 36 4
gpt4 key购买 nike

我的 .NET 应用程序在很短的时间内使用了非常多的 RCW(不到一秒内使用了数千个 RCW)。我可以使用以下性能计数器来衡量此行为: - 处理 -> 处理计数 - .NET CLR 内存 -> # of Sink Blocks in use

我们已经在 RCW 周围正确地实现了 IDisposable 包装器对象;我们在各种 RCW 上以适当的顺序调用 Marshal.FinalReleaseComObject。

根据 this blog post ,在 RCW 完成之前,RCW 下的 COM 对象实际上并没有被清理。

使用 GC.AddMemoryPressure 强制 GC 更快地清理我们的 RCW 以防止内存不足错误是否合适?

最佳答案

您应该维护对每个 COM 对象的显式托管引用,并调用 Marshal.ReleaseComObject一旦不再需要 COM 对象。

This method is used to explicitly control the lifetime of a COM object used from managed code. You should use this method to free the underlying COM object that holds references to resources in a timely manner or when objects must be freed in a specific order.

请注意,使用“双点”会导致运行时创建隐藏的托管引用,例如Excel 中的常见模式:

Worksheet sheet = excelApp.Worksheets.Open(sheetName);

创建一个包装工作表的隐藏托管对象。首选方法是

Worksheets sheets = excelApp.Worksheets; 
Worksheet sheet = sheets.Open(sheetName);

您将按照创建它们的相反顺序对每个托管变量调用 Marshal.ReleaseComObject。

如果您确实有对 COM 对象的隐藏引用,我所看到的唯一可靠的处理它们的方法是

GC.Collect();
GC.WaitForPendingFinalizers();

关于c# - 使用 GC.AddMemoryPressure 触发更频繁的 Runtime Callable Wrapper (RCW) 终结是否合适?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29973661/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com