在WPF中使用Popup时出现COMException

时间:2009-09-21 11:48:23

标签: .net wpf popup

我有一个非常烦人的异常,它会冻结我的WPF抛出的应用程序,当这个弹出窗口的内容似乎有很多元素时。 在输出窗口中,我看到了大约50倍的异常。

  

'System.Runtime.InteropServices.COMException'   发生在UIAutomationProvider.dll

然后有时在冻结后我有这个例外:

  

检测到ContextSwitchDeadlock   消息:CLR无法执行此操作   从COM上下文0x3bd0048转换   到COM上下文0x3bd01b8为60   秒。拥有的线程   目的地环境/公寓是最多的   可能要么做一次非抽水等待   或者处理很长时间   没有泵Windows的操作   消息。这种情况一般都有   负面的业绩影响和可能   甚至导致应用程序成为   无响应或内存使用   随着时间的推移不断积累。至   一切都避免这个问题   线程公寓(STA)线程   应该使用抽等待原语   (例如CoWaitForMultipleHandles)和   经常在长时间内发送消息   正在运行。

我的代码中没有使用任何COM组件,有人已经有这个问题吗?

调试器检测到死锁,并且没有任何堆栈跟踪。 COM异常堆栈跟踪是:

  

{“一个事件无法调用任何一个   订阅者(例外情况)   HRESULT:0x80040201)“}

     

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

     

在   MS.Internal.Automation.UiaCoreProviderApi.UiaHostProviderFromHwnd(IntPtr的   HWND)

当我打电话

popup.IsOpen = true

3 个答案:

答案 0 :(得分:4)

解决方案是在弹出窗口的内容上使Visibility =“Collapsed”,而不是关闭弹出窗口,但它有点hacky。

答案 1 :(得分:1)

我遇到了同样的问题。我想这与连接到我的电脑的多点触控启用戴尔显示器有关。当我停止平板电脑输入服务时,ComExceptions消失了。也许这也是你的选择。

答案 2 :(得分:1)

我通过卸载Wacom Pen和Touch平板电脑并禁用平板电脑输入服务来解决此问题。 我在WPF Popups(TogglePopups,Comboboxes等)和Expanders中遇到过这个问题。