Mam async
metodę, która jest długo działa metoda, która czyta strumień i gdy znajdzie coś uruchamia zdarzenie:Konwersja metody asynchronicznej wrócić IObservable <>
public static async void GetStream(int id, CancellationToken token)
Zajmuje token anulowania ponieważ to jest tworzenie w nowym zadaniu. Wewnętrznie nazywa to await
gdy czyta strumień:
var result = await sr.ReadLineAsync()
Teraz chcę przekonwertować to do metody, która zwraca IObservable <> tak, że mogę używać tego z reaktywnymi rozszerzeń. Z tego co czytałem, najlepszym sposobem na to jest za pomocą Observable.Create
i od RX 2.0 obsługuje teraz także asynchroniczny mogę to wszystko do pracy z mniej więcej tak:
public static IObservable<Message> ObservableStream(int id, CancellationToken token)
{
return Observable.Create<Message>(
async (IObserver<Message> observer) =>
{
reszty kodu wewnątrz jest taki sam, ale zamiast wystrzeliwania zdarzeń dzwonię pod numer observer.OnNext()
. Ale to wydaje się złe. Z jednej strony miksuję tam CancellationTokeny, i chociaż dodanie słowa asynchronicznego sprawiło, że działa, czy to naprawdę najlepsza rzecz do zrobienia? Dzwonię do mojego ObservableStream tak:
Client.ObservableStream(555404, token).ObserveOn(Dispatcher.CurrentDispatcher).SubscribeOn(TaskPoolScheduler.Default).Subscribe(m => Messages.Add(m));
Należy prawie nigdy nie używać 'asynchroniczny void', na pewno nie w metodach bibliotecznych. – svick