我编写了一个简单的服务器 - 客户端设置,都使用WPF作为接口。当服务器关闭时,我想做出反应并向所有连接的客户端发送通知。这就是我用来做的事情:
在窗口声明中,我定义了一个Closing
处理程序:
<Window x:Class="EPQMessenger.Windows.ServerWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:gif="http://wpfanimatedgif.codeplex.com"
Title="Messenger: Server" Height="350" Width="700"
Closing="Window_Closing">
在窗口的代码隐藏中,我有处理程序本身:
private void Window_Closing(object sender, CancelEventArgs e)
{
e.Cancel = true;
this.Log("Closing event canceled. Start sending shutdown signals...");
_server.SendShutdown();
this.Log("Shutdown signal sending complete. Shutting down.");
Environment.Exit(0);
}
(注意:Log
方法会向屏幕和文件添加消息。)
它调用的方法Server.SendShutdown
:
public void SendShutdown()
{
foreach (KeyValuePair<string, TcpClient> pair in _clients)
{
try
{
pair.Value.Send(Protocol.GetResponseFromCode(104));
_console.Log("Sent shutdown signal to {0}", pair.Key);
}
catch (IOException e)
{
_console.Log("Failed to send shutdown to '{0}': {1}", pair.Key, e.Message);
}
catch (InvalidOperationException e)
{
_console.Log("Failed to send shutdown to '{0}': {1}", pair.Key, e.Message);
}
}
}
(_console.Log
与上一个代码段中的Log
方法相同。)
这里的问题是客户有时只会得到通知。事件被触发,SendShutdown
被调用 - 但客户端有时只接收通知,而日志文件有时只有“已发送关闭...”消息。
如果我尝试同步写入NetworkStream
,则会出现同样的问题。
为什么会这样,我该如何解决?