通过WCF关闭WPF应用程序需要太长

时间:2015-07-17 09:26:54

标签: c# wpf wcf

我有一个承载WCF服务的WPF应用程序。此服务的一部分是能够从另一个客户端(在同一台机器上运行)关闭应用程序。我使用以下代码在WCF服务中关闭它:

MainWindow form = MainWindow.CurrentInstance;
form.MySynchronizationContext.Send(_ => form.CloseWindow(), null);

我的MainWindow设置了一个静态CurrentInstance变量,因此我可以获取当前窗口,然后通过SynchronizationContext调用我添加的名为CloseWindow的方法。这一切都很好,除了需要很长时间才能关闭(大约10秒),这比手动关闭应用程序要长很多。

有没有更好的方法做到这一点,反应更快?

更新 - 目前CloseWindow函数只调用Close(),但最终可能会执行其他一些操作。

1 个答案:

答案 0 :(得分:0)

我已经找到了解决这个问题的方法,但我并不完全理解为什么这是一个问题,因为它应该已经是这样了。

使用以下

声明服务
[ServiceBehavior(UseSynchronizationContext = false)]

我的理解是,使用此语句,即使服务是在MainWindow类中创建的,它仍然会被强制创建自己的线程,而不是在UI线程上运行。事实证明,情况似乎并非如此。我在创建之前将主机创建移动到MainWindow类之外,现在几乎立即发生了关闭。我只能假设(没有深入挖掘)UseSynchronizationContext = false并不强制不在UI线程上创建服务主机。

虽然这解决了这个问题,但我很想知道为什么设置服务行为没有任何区别。