为什么在关闭时不调用此方法?

时间:2015-08-11 15:50:05

标签: c# wpf event-handling

我编写了一个简单的服务器 - 客户端设置,都使用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,则会出现同样的问题。

为什么会这样,我该如何解决?

0 个答案:

没有答案