我有一个WPF应用程序,它在Windows Shutdown(System.Windows.Application.Current.SessionEnding事件)上异步调用WCF方法,然后关闭应用程序。但有时WCF方法永远不会到达服务器端。
我在客户端和服务器端都有日志,告诉我何时发出请求并完成。大多数时候它运行良好,我可以看到客户端的请求到达服务器,然后应用程序退出。但有时我只能看到客户端发出请求而从未到达服务器。
我认为问题可能是在Windows关闭的过程中,有时来自我的WPF应用程序的WCF请求是在网络连接已经关闭时发出的。这可能是原因吗?如果是,是否有一些解决方法?
由于
答案 0 :(得分:0)
如果您正在进行异步调用,则会在后台线程上进行。
后台线程无法停止应用程序关闭,并在应用程序关闭时终止。可能发生的事情是操作系统告诉你的应用程序它正在关闭PC,你的应用程序尝试发出异步请求,但是没有设法这样做,因为正在创建它的后台线程在应用程序关闭时被终止。这不一定会一直发生,但肯定会发生,因为没有什么可以确保线程保持活着。
您应该做的是明确创建一个新线程并使用它来同步调用您的服务。通过手动创建线程,您可以将其设置为前台线程;前台线程将不允许应用程序关闭,直到它们完成。这样:
public void OnShutdown()
{
var executionThread=new Thread(RunWcfMethod);
executionThread.IsBackgroundThread=false;
executionThread.Start();
}
private void RunWcfMethod()
{
var serviceClient=new ShutdownServiceClient();
serviceClient.NotifyServerOfShutdownSyncronously();
}