C# 如何处理VisualStudio内存堆快照中的异常?

C# 如何处理VisualStudio内存堆快照中的异常?,c#,.net,visual-studio,memory-management,heap-memory,C#,.net,Visual Studio,Memory Management,Heap Memory,我对在VisualStudio中尝试优化内存使用还不熟悉。我的C#.NET自动化应用程序的内存使用量迅速增加,我想防止这种情况发生。我在第一次启动堆时拍摄了一个堆快照,然后在内存变高时拍摄了另一个。但我真的不知道如何处理我在差异中看到的这些东西 我特别关注的是COMExceptions和ElementNotAvailableExceptions。我理解这些例外情况是什么,但我不明白为什么RAM中有这么多例外情况,或者如何减少这些例外情况。ElementNotAvailableExceptions

我对在VisualStudio中尝试优化内存使用还不熟悉。我的C#.NET自动化应用程序的内存使用量迅速增加,我想防止这种情况发生。我在第一次启动堆时拍摄了一个堆快照,然后在内存变高时拍摄了另一个。但我真的不知道如何处理我在差异中看到的这些东西

我特别关注的是
COMExceptions
ElementNotAvailableExceptions
。我理解这些例外情况是什么,但我不明白为什么RAM中有这么多例外情况,或者如何减少这些例外情况。
ElementNotAvailableExceptions
在各自的函数中被捕获,因此应该在函数完成后立即从内存中消失,对吗?我不会把它们保存到静态变量或任何类似的疯狂的东西中。我当然也不会保存异常。为什么这些东西会在我的堆快照中占用这么多内存

还有,ConcurrentStack+节点到底是什么?我从来没有在代码中使用过术语
ConcurrentStack
,当我展开它时,我看不到任何我理解的东西。我该怎么做才能让它占用这么多的内存呢

编辑:以下是为
元素NotAvailableExceptions
显示的根目录的
路径,这些路径似乎无助于告诉我任何有价值的信息


我从来没有弄明白为什么
元素NotAvailableException
会留在RAM中(当它封装在函数中时,垃圾收集会定期运行,我不是有意将它们保存到静态变量中)。但我确实解决了RAM问题,在尝试获取其子项或兄弟项或其他内容之前,确保每个
AutomationElement
都不为null(而不是像我这样尝试捕获这些异常,然后在代码中继续)


你的问题太宽泛了。要理解为什么某个特定对象仍然是活动的,您必须找到它到GC根的路径。为此使用内存分析器—它将向您显示对象仍然处于活动状态的原因。此外,如果您使用UIA的.Net包装器来处理的不仅仅是一个短暂的简单用例,那么您将陷入一个痛苦的世界。直接使用UIA COM接口也不会太糟糕。请注意,如果不使用包装器,则必须小心线程处理。@Mitch,我正在使用它。这是痛苦的东西吗?或者你指的是不同的东西?您是否尝试使用DebugDiag分析转储?如果您不习惯使用内存转储,那么它可能比VS更有用是的,这是一个看似简单的方法。我不完全同意你的观点,但它确实提供了一些历史。点击
IUIAutomation
接口的复杂性与使用包装器的复杂性大致相同——因此,如果这是一个复杂的用例或任务关键型用例,我将从这里开始。首先添加对
UIAutomationClient
(COM库)的引用,而不是
System.Windows.Automation
。例子:
if (myAutomationElement != null)
{
    AutomationElement parent = walker.GetParent(myAutomationElement);
}