2015-07-17 2 views
0

У меня есть приложение WPF, в котором есть служба WCF. Часть этой услуги - это возможность закрыть приложение от другого клиента (работает на том же компьютере). Я использую следующий код, чтобы закрыть его в службе WCF:Закрытие приложения WPF через WCF слишком длинное

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

Мой MainWindow является установка с статической переменной CurrentInstance, так что я могу получить текущее окно, а затем я вызываю метод, который я добавил под названием CloseWindow через SynchronizationContext. Все это работает отлично, за исключением того, что требуется много времени, чтобы закрыть (около 10 секунд), что намного больше, чем если вы закрываете приложение вручную.

Есть ли лучший способ сделать это более отзывчивым?

Обновление - В настоящий момент функция CloseWindow вызывает только Close(), но в конце концов может сделать несколько других бит.

+0

Можно ли убить приложение или должна ли служба закрыть окно правильно? –

+0

Без убийства приложение не является вариантом. – Jon49

+0

«Есть лучший способ» Нет, это должно сработать. Приостановите отладчик во время зависания и посмотрите, что делают все потоки. Должно быть какое-то ожидание. – usr

ответ

0

Я нашел решение этой проблемы, но я не совсем понимаю, почему это было проблемой в первую очередь, как и должно было быть.

Служба была объявлена ​​следующим

[ServiceBehavior(UseSynchronizationContext = false)] 

Это мое понимание того, что с этим утверждением, даже если услуга была создана в классе MainWindow, он все равно будет вынужден создать свой собственный поток, а не выполняются в потоке пользовательского интерфейса. Оказывается, это не так. С тех пор я создал перемещение хоста вне класса MainWindow до его создания, и теперь Close происходит почти сразу. Я могу только предположить (не углубляясь), что UseSynchronizationContext = false не заставляет хост-сервер не создаваться в потоке пользовательского интерфейса.

Хотя это решает проблему, я хотел бы знать, почему настройка поведения службы не имеет никакого значения.

Смежные вопросы