2

我在使用 xamarin 消息中心时遇到了一个烦人的问题。我添加了一些断点,并注意到只发送了一条消息,但订阅者收到了两次。

我的发件人代码(第 2 页):

async void CompartilhaMapa(System.Object sender, System.EventArgs e)
{ 

    ...        

   MessagingCenter.Send<Page2, ParamType>(this, "PopUpData", new ParamType() { Tipo = 2, Valor = Coords });
   Console.WriteLine("msg sent"); //displayed only once and line above has a break line assuring this
   await Navigation.PopPopupAsync();
}

第1页(订阅者):

protected override void OnAppearing()
{
   base.OnAppearing();
   MessagingCenter.Subscribe<Page2, ParamType>(this, "PopUpData", async (sender, arg) =>
   {
      Task.WaitAll(tasks.ToArray());
      switch (arg.Tipo)
      {
          case 2:
             Console.WriteLine(" *********** msg received"); //this is outputted twice
             tasks.Add(Task.Run(() => ShareMap(arg))); //this is called twice
             break;
             case 3: tasks.Add(Task.Run(() => ShareEvent(arg))); break;
             case 6: tasks.Add(Task.Run(() => ShareImage(arg))); break;
      }
    });
}

protected override void OnDisappearing()
{
   base.OnDisappearing();
   MessagingCenter.Unsubscribe<Page2, ParamType>(this, "PopUpData");
}

我在这里做错了什么?

4

1 回答 1

-2

这有两个可能的原因:

原因 1 - 消息被多次发送。由于您坚持只发送一次,所以我将忽略这一点。我仍然建议您应该在您的函数(发送方代码)中放置一个断点CompartilhaMapa,以确保该函数实际上只被调用一次。

原因 2 - 您已多次订阅该事件。为了解决这个问题,

  1. 将订阅事件放在 page1 的构造函数中,而不是放在 OnAppearing 中。
public Page1()
{
    ...
    MessagingCenter.Subscribe<Page2, ParamType>(this, "PopUpData", async (sender, arg) => ...

}
  1. 将取消订阅事件放在 Page1 的析构函数中,而不是放在 OnDisappearing 中。(您甚至可以将其放置在 OnBackButtonPressed 覆盖函数中,而不是 Page1)
~Page1()
{
    ...
    MessagingCenter.Unsubscribe<Page2, ParamType>(this, "PopUpData")
}

我假设 Page1 是页面的名称,只需将其替换为实际名称即可。


解决方法 - 您已多次订阅该事件。为了解决这个问题,

  1. 在任何使用 subscribe 事件之前放置 unsubscribe 事件
public void SampleFunction()
{
    ...
    MessagingCenter.Unsubscribe<Page2, ParamType>(this, "PopUpData")
    MessagingCenter.Subscribe<Page2, ParamType>(this, "PopUpData", async (sender, arg) => ...

}
于 2020-06-11T17:02:29.327 回答