在使用WPF的弹出窗口时,我遇到了COMException异常。

11

我遇到了一个很烦人的异常,它会冻结我的 WPF 应用程序,当此弹出窗口的内容具有太多元素时会抛出该异常。

在输出窗口中,我看到大约出现了50次这个异常:

System.Runtime.InteropServices.COMException

发生在 UIAutomationProvider.dll 中

然后有时在冻结后我会得到以下异常:

检测到 ContextSwitchDeadlock 消息:CLR 无法从 COM 上下文 0x3bd0048 转换到 COM 上下文 0x3bd01b8,持续时间为 60 秒。拥有目标上下文 / 公寓的线程很 可能正在等待非泵送等待或者在处理非常长 的运行操作时未泵送 Windows 消息。这种 情况通常会对性能产生负面影响,甚至可能导 致应用程序变得无响应或内存使用不断积累。 为避免这个问题,所有单线程公寓 (STA) 线 程都应该使用泵送等待原语(例如 CoWaitForMultipleHandles),并在长时间运行的操作期间定期泵送消息。

我在代码中没有使用任何 COM 组件,请问是否有人遇到过这个问题?

调试器检测到死锁并且没有任何堆栈跟踪。

COM 异常的堆栈跟踪如下:

{"事件无法调用任何订户(HRESULT 错误:0x80040201 异常)"}

at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)

at MS.Internal.Automation.UiaCoreProviderApi.UiaHostProviderFromHwnd(IntPtr hwnd)

当我调用

popup.IsOpen = true

我遇到过类似的问题,但是我不记得具体情境了。你能否贴出相关的代码或堆栈跟踪信息? - bohdan_trotsenko
1
WPF 4.0 中出现这种严重的 bug,只是说一下。 - Luke Puplett
在调试WPF应用程序时,当打开下拉列表框中的Combobox时,发生了这个异常。我有点小慌但无法重现这个问题。我还注意到,在COM崩溃后,我的Win XP模式虚拟应用程序窗口消失了(但显然仍在运行)。非常奇怪的事情。 - Sean Hanley
3个回答

4
一种解决方法是将弹出窗口的内容设置为Visibility="Collapsed",而不是关闭弹出窗口,但这有点瑕疵。

1

我通过卸载 Wacom Pen and Touch 平板和禁用平板输入服务来解决了这个问题。我在使用 WPF 弹出窗口(TogglePopups、Comboboxes 等)和 Expanders 时遇到了这个问题。


1

我遇到了同样的问题。我猜测这可能与连接在我的电脑上的多点触控戴尔显示器有关。当我停止“平板输入服务”时,ComExceptions 就消失了。也许这对你也是一个选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接