【问题标题】:Event Handler is executed more than once事件处理程序多次执行
【发布时间】:2016-08-04 11:57:43
【问题描述】:

当我使用这段代码的 sn-p 时,MessageOutput.Text 被设置了 2 次,这意味着代码被执行了两次,因为我没有在其他任何地方设置 MessageOutput.Text。每当我收到一条新消息时,都会调用此方法并且它应该更新 UI。为什么会发生这种情况,我该如何解决?

 async void MessageReceived(DatagramSocket socket, DatagramSocketMessageReceivedEventArgs eventArguments)
    {
        uint stringLength = eventArguments.GetDataReader().UnconsumedBufferLength;
        string receivedMessage = eventArguments.GetDataReader().ReadString(stringLength);

        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            MessageOutput.Text += (receivedMessage + "\n");
        });
    }

【问题讨论】:

  • 您确定该方法没有被调用两次吗?
  • 当我收到一条新消息listenerSocket.MessageReceived += MessageReceived;时调用此方法,在这种情况下它会显示两次收到的消息。
  • 这根本不会改变我的问题。在MessageReceived的第一行打个断点,看看有没有命中两次
  • 是的,它被调用了两次,但我不知道为什么。
  • 请编辑您的问题并在添加事件处理程序的位置添加代码。如果您这样做的地方不止一处,请全部展示。

标签: c# events event-handling


【解决方案1】:

为什么会发生这种情况,我该如何解决

最可能的原因是,您的系统中有多个virtual network switches

例如,我的 Windows 10 中有三个虚拟网络交换机,只需转到 控制面板->网络和 Internet->网络连接

我会同时收到三条消息:

Debug.WriteLine("Received data from remote peer (Remote Address: " +
                    eventArguments.RemoteAddress.CanonicalName + ", Remote Port: " +
                    eventArguments.RemotePort + "): \"" + receivedMessage + "\"");

从远程对端接收到的数据(远程地址:169.254.146.116,远程端口:22113):“Hello” 从远程对端接收数据(远程地址:172.16.80.1,远程端口:22113):“Hello” 从远程对端接收到的数据(远程地址:10.168.177.14,远程端口:22113):“Hello”

请在 cmd 中输入 ipconfig /all 以检查这些交换机的 IPv4 地址:

【讨论】:

  • 非常感谢,我所要做的就是禁用我的“vEthernet(内部以太网端口 Windows Phone 模拟器内部交换机)”。
【解决方案2】:

我怀疑问题出在这一行。

listenerSocket.MessageReceived += MessageReceived;

请在您绑定此事件处理程序的位置添加代码。因为异常这条线执行了 2 次。所以这就是你的事件处理程序被执行两次的原因。因此你必须弄清楚为什么这个事件被绑定了两次,你的问题就会得到解决。 希望有帮助!!!

【讨论】:

  • 这不是答案。您需要获得足够的声望才能发布 cmets。
  • 我没有因为回答您的问题而享有声誉,但感谢您的评论。
  • 对不起,我不明白你的意思。你应该删除这个答案。
猜你喜欢
  • 2011-12-12
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2012-03-30
  • 2011-01-15
  • 1970-01-01
相关资源
最近更新 更多