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?
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");
}