Utilizzando Rx per chiamare un metodo di servizio WCF asincrono sta causando problemi di chiusura
-
25-09-2019 - |
Domanda
Attualmente sto usando questo codice tu chiamare un webservice per ottenere i dati per una pagina dell'applicazione. Tutto va bene fino a quando provo a chiamare questo metodo 10 volte di fila senza attendere la prima chiamata alla fine.
In questo modo sta causando me di avere un problema con le chiusure e ottengo lo stesso oggetto risultato per tutti i miei risultati.
qualcuno ha affrontato questo con Rx.Net prima? in tal caso qualcuno ha un'idea o un cavo in modo che io possa risolvere il 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);
}
Soluzione
È sempre Service
la stessa istanza? Se è così, si sta andando a correre in tutti i tipi di follia per cui gli eventi GetPageCompleted
saranno gestiti dal FromEvent
creato da una chiamata diversa (con argomenti diversi), il che spiegherebbe il motivo per cui i risultati sono gli stessi per tutti i metodi che sono stati chiamati a allo stesso tempo.
È possibile aggirare questo problema specifico utilizzando i metodi End Begin /, anche se si ancora probabile incorrere in problemi con contesa sul collegamento sottostante.
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);
}