Usando o RX para chamar um método de serviço WCF Async está causando problemas de fechamento
-
25-09-2019 - |
Pergunta
Atualmente, estou usando este código TU Ligue para um Serviço da Web para obter dados para uma página de aplicativo. Tudo está bem até eu tentar chamar esse método 10 vezes seguidas sem esperar a primeira chamada para terminar.
Fazer isso está me fazendo ter um problema com o fechamento e recebo o mesmo objeto de resultado para todos os meus resultados.
Alguém já enfrentou isso com o RX.NET antes? Nesse caso, alguém tem uma ideia ou lead para que eu possa resolver esse problema.
public void GetPage(long pageId, Action<PageDTO> observer)
{
Observable.FromEvent<GetPageCompletedEventArgs>(
handler => Service.GetPageCompleted += handler,
handler => Service.GetPageCompleted -= handler)
.Select(eventHandler => eventHandler.EventArgs.Result)
.Take(1) // necessary to ensure the observable unsubscribes
.ObserveOnDispatcher() // controls which thread the observer runs on;
.Subscribe(observer, HandleError);
Service.GetPageAsync(pageId);
}
Solução
É Service
Sempre a mesma instância? Nesse caso, você vai encontrar todos os tipos de loucura em que GetPageCompleted
Os eventos serão tratados pelo FromEvent
Criado por uma chamada diferente (com argumentos diferentes), o que explicaria por que seus resultados são os mesmos para todos os métodos que foram chamados ao mesmo tempo.
Você pode contornar esse problema específico usando os métodos iniciantes/finais, embora você ainda provavelmente tenha problemas com a contenção na conexão subjacente.
public void GetPage(long pageId, Action<PageDTO> observer)
{
Observable.FromAsyncPattern<long, PageDTO>(
service.BeginGetAwards, service.EndGetAwards)(pageId)
.ObserveOnDispatcher() // controls which thread the observer runs on;
.Subscribe(observer, HandleError);
}