我有一個async
方法是讀取流中的長時間運行的方法,並在找到的東西觸發一個事件:轉換異步方法返回的IObservable <>
public static async void GetStream(int id, CancellationToken token)
這需要取消標記,因爲它是創造一項新任務。在內部調用await
時,它讀取數據流:
var result = await sr.ReadLineAsync()
現在,我想將其轉換爲一個返回的IObservable <>,使我可以利用此功能反應擴展的方法。從我讀過,要做到這一點的最好辦法是使用Observable.Create
,由於RX 2.0現在還支持異步I可以得到這一切的是這樣工作的:
public static IObservable<Message> ObservableStream(int id, CancellationToken token)
{
return Observable.Create<Message>(
async (IObserver<Message> observer) =>
{
代碼內的其餘是一樣的,但我沒有打電話給我打電話observer.OnNext()
。但是,這感覺不對。首先,我在裏面混合了CancellationTokens,儘管添加了async關鍵字使它起作用,但這實際上是最好的做法嗎?我打電話給我的ObservableStream這樣的:
Client.ObservableStream(555404, token).ObserveOn(Dispatcher.CurrentDispatcher).SubscribeOn(TaskPoolScheduler.Default).Subscribe(m => Messages.Add(m));
你應該幾乎從來不使用'異步void',肯定不會在圖書館的方法。 – svick