当从插件调用WPF时,Excel关闭速度缓慢

4
我有一个Excel插件,上面有一个按钮,点击它会在一个新线程上调用一个WPF应用程序。当我关闭Excel时,如果没有打开我的WPF应用程序或者打开它然后再次关闭它,Excel会立即关闭,但是每当我打开应用程序然后关闭Excel时,Excel需要5-10秒才能关闭。我只找到了以下两种解决方案,但都没有帮助:

我正在运行VS 2010和Excel 2010,所以不应该存在互操作性问题。

有人有建议吗?

线程代码:

Private qbdThread As Thread = Nothing
Private frmQBD As QBDApplication.MainWindow

qbdThread = New Thread(New ParameterizedThreadStart(AddressOf RunQBD))
qbdThread.SetApartmentState(Threading.ApartmentState.STA)
qbdThread.Start(TabletType)
AddHandler QBDApplication.MainWindow.QBDClose, AddressOf QBDThreadClose

Private Sub RunQBD(Optional tabletQBDSelected As String = Nothing)
...

frmQBD = New QBDApplication.MainWindow(contacts, saveLocation, tabletQBDLocal)
frmQBD.Show()
frmQBD.Activate()
System.Windows.Threading.Dispatcher.Run()
End Sub

当用户在新线程上关闭应用程序时,此代码将运行:

Me.Close()
System.Windows.Threading.Dispatcher.CurrentDispatcher.InvokeShutdown()

在主线程上引发了一个事件(ThisAddin.vb),其代码如下:
Private Sub QBDThreadClose()
    qbdThread = Nothing
    frmQBD = Nothing
End Sub

需要注意的另一件事是,当frmQBD不作为类变量创建,而是在“RunQBD”子程序中定义尺寸时,就不会出现这个问题。这可以解决我的问题,但我将无法像frmQBD.Activate()那样在主线程上访问它,而这正是我需要做的。

编辑:代码已更新


你尝试安装第一个链接中提到的更新来检查是否解决了问题了吗? - Jane
是的,这就是我提到它的原因。应该表达得更清楚些。 - user
2个回答

5

我们为这个问题找到了一个解决方案。

您需要在框架中设置一个AppSwitch

Public Sub EnablePointerSupport()
AppContext.SetSwitch("Switch.System.Windows.Input.Stylus.EnablePointerSupport",True)
End Sub

您可以在这里这里找到更多有关它的信息。

2
你刚刚帮助我解决了在Jira上困扰我六个月的问题!感谢您发布答案! - Alexey Andrushkevich
为什么这样解决问题有什么直觉依据吗?我有一个带有WPF面板的VSTO插件。根据运行插件的Office版本,会出现长时间关闭的问题。也许是我理解不够,但通过设置开关来解决这个问题似乎有点巧妙。 - undefined

1
这个 Microsoft bug 在 https://connect.microsoft.com/VisualStudio/feedback/details/783019/word-slow-shutdown-on-windows-8-when-using-wpf-in-application-addin 中有描述。它最初于2013年报告,据说在2014年修复了,但现在似乎又回来了。
我们可以在运行 Windows 10 的 Excel 和 Word 2016 中复现这个确切的问题,但神奇的是 PowerPoint 中没有。已安装最新版本的 VSTO Runtime。我们无法在运行 Windows 8.1 的 Office 2013 中复现该问题。
解决方法如上述链接所述--转到设备管理器 > 人体学接口设备并禁用“HID-compliant touch screen”(在我们的测试中)或可能是其他“HID-compliant”项目之一。

在Windows 10(1903)和新的Surface设备上遇到了同样的问题。有什么建议吗? - Summer-Time
更新:我们现在可以在运行Windows 8.1的Office 2013中重现该问题。在安装最近的Office更新后观察到了该问题,但我们无法确认该更新是否导致了这种行为。无论如何,自从据称在2014年修复后,这个问题似乎只是范围越来越大。 - OfficeAddinDev

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