Ho un metodo di async
che è un metodo di lunga durata che legge un ruscello e quando trova qualcosa genera un evento:Conversione di un metodo asincrono per tornare IObservable <>
public static async void GetStream(int id, CancellationToken token)
Si prende un gettone cancellazione perché è creato in un nuovo compito. Internamente chiama await
quando legge un flusso:
var result = await sr.ReadLineAsync()
Ora, voglio convertire questo a un metodo che restituisce un IObservable <> in modo che posso usare questo con le estensioni reattivi. Da quello che ho letto, il modo migliore per farlo è usare Observable.Create
, e dal momento che RX 2.0 ora supporta anche asincrona posso ottenere tutto per lavorare con qualcosa di simile:
public static IObservable<Message> ObservableStream(int id, CancellationToken token)
{
return Observable.Create<Message>(
async (IObserver<Message> observer) =>
{
Il resto del codice all'interno è lo stesso, ma invece di lanciare eventi, sto chiamando observer.OnNext()
. Ma questo sembra sbagliato. Per prima cosa sto mixando CancellationTokens e, sebbene l'aggiunta della parola chiave async abbia funzionato, è questa la cosa migliore da fare? Chiamo il mio ObservableStream in questo modo:
Client.ObservableStream(555404, token).ObserveOn(Dispatcher.CurrentDispatcher).SubscribeOn(TaskPoolScheduler.Default).Subscribe(m => Messages.Add(m));
si dovrebbe quasi mai usare 'asincrona void', certamente nei metodi di libreria. – svick