我有一个承载WCF服务的WPF应用程序。此服务的一部分是能够从另一个客户端(在同一台机器上运行)关闭应用程序。我使用以下代码在WCF服务中关闭它:
MainWindow form = MainWindow.CurrentInstance;
form.MySynchronizationContext.Send(_ => form.CloseWindow(), null);
我的MainWindow设置了一个静态CurrentInstance变量,因此我可以获取当前窗口,然后通过SynchronizationContext调用我添加的名为CloseWindow的方法。这一切都很好,除了需要很长时间才能关闭(大约10秒),这比手动关闭应用程序要长很多。
有没有更好的方法做到这一点,反应更快?
更新 - 目前CloseWindow函数只调用Close(),但最终可能会执行其他一些操作。
答案 0 :(得分:0)
我已经找到了解决这个问题的方法,但我并不完全理解为什么这是一个问题,因为它应该已经是这样了。
使用以下
声明服务[ServiceBehavior(UseSynchronizationContext = false)]
我的理解是,使用此语句,即使服务是在MainWindow类中创建的,它仍然会被强制创建自己的线程,而不是在UI线程上运行。事实证明,情况似乎并非如此。我在创建之前将主机创建移动到MainWindow类之外,现在几乎立即发生了关闭。我只能假设(没有深入挖掘)UseSynchronizationContext = false并不强制不在UI线程上创建服务主机。
虽然这解决了这个问题,但我很想知道为什么设置服务行为没有任何区别。