Вызов метода WCF при завершении работы Windows иногда не удается - PullRequest
3 голосов
/ 11 июля 2011

У меня есть приложение WPF, которое при завершении работы Windows (событие System.Windows.Application.Current.SessionEnding) вызывает метод WCF асинхронно, а затем приложение закрывается. Но иногда метод WCF никогда не достигает серверной стороны.

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

Я думаю, что проблема может заключаться в том, что в процессе закрытия окон иногда делается запрос WCF из моего приложения WPF, когда сетевое соединение уже отключено. Может ли это быть причиной? Если это так, есть ли какое-то решение?

Спасибо

1 Ответ

0 голосов
/ 14 октября 2011

Если вы делаете вызов асинхронно, то это происходит в фоновом потоке.

Фоновые потоки не могут остановить закрытие приложения и прекращаются при закрытии приложения.Может случиться так, что ОС сообщает вашему приложению, что оно выключает ПК, ваше приложение пытается сделать свой асинхронный запрос, но ему не удается это сделать, потому что фоновый поток, который его выполняет, завершается при закрытии приложения.Это не обязательно будет происходить постоянно, но определенно произойдет, потому что там нет ничего, чтобы гарантировать, что поток поддерживается.

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

public void OnShutdown()
{
    var executionThread=new Thread(RunWcfMethod);
    executionThread.IsBackgroundThread=false;
    executionThread.Start();
}

private void RunWcfMethod()
{
    var serviceClient=new ShutdownServiceClient();
    serviceClient.NotifyServerOfShutdownSyncronously();
}
...