Search code examples
c#xamarinmessagingcenter

Xamarin messaging center subscribing multiple times


I'm dealing with a page that needs to send information to another and I'm doing this through messaging center but I noticed that messages are being sent once and received 2,4,6 times... depending on how many times I opened the subscriber page. The strange is that I had added some code to avoid subscribing more than once. See the relevant part of my code:

Sender:

if (result.status == "ok")
{
    MessagingCenter.Send<ChatCompartilhar, PassaParametro>(this, "PopUpData", new PassaParametro(){ Tipo = 3, Valor = result.msg, Extra = dataFinal });
    await Navigation.PopPopupAsync();
}

Subscriber:

Page()
{
  MessagingCenter.Unsubscribe<ChatCompartilhar, PassaParametro>(this, "PopUpData");
  MessagingCenter.Subscribe<ChatCompartilhar, PassaParametro>(this, "PopUpData", async (sender, arg) =>
  {
        Task.WaitAll(tasks.ToArray());
        switch (arg.Tipo)
        {
          case 2: tasks.Add(Task.Run(() => ShareMap(arg))); break;
          case 3: tasks.Add(Task.Run(() => ShareEvent(arg))); break;
          case 6: tasks.Add(Task.Run(() => ShareImage(arg))); break;
        }
   });
}

~Page()
{
  MessagingCenter.Unsubscribe<ChatCompartilhar, PassaParametro>(this, "PopUpData");
}

I put line break on sender line and could see it's executed only once but on subscriber, line breaks shows multiple executions. What can I do to avoid that?


Solution

  • Instead of giving current reference, you can try passing the Key name.

    Page()
    {
      MessagingCenter.Unsubscribe<ChatCompartilhar, PassaParametro>("SomeKey", "PopUpData");
      MessagingCenter.Subscribe<ChatCompartilhar, PassaParametro>("SomeKey", "PopUpData", async (sender, arg) =>
      {
            Task.WaitAll(tasks.ToArray());
            switch (arg.Tipo)
            {
              case 2: tasks.Add(Task.Run(() => ShareMap(arg))); break;
              case 3: tasks.Add(Task.Run(() => ShareEvent(arg))); break;
              case 6: tasks.Add(Task.Run(() => ShareImage(arg))); break;
            }
       });
    }
    
    ~Page()
    {
      MessagingCenter.Unsubscribe<ChatCompartilhar, PassaParametro>("SomeKey", "PopUpData");
    }