我正在学习在.NET中以正确的方式进行rx,并想知道从远程函数调用中生成可观察流的通常方法是什么。
此刻,我只是创建一个Subject<T>
并在回调方法中调用其OnNext
函数。
示例:
subject.AsObservable().Where(...).Subscribe(...);
这是我过滤并订阅可观察对象的地方。
await speechService.StartListeningAsync(f => OnSpeechCommandRecognized(f),
cts.Token, OnError, interimResults).ConfigureAwait(false);
这是我将回调方法传递给语音服务的地方。
private void OnSpeechCommandRecognized(StreamingRecognitionResult result)
{
subject.OnNext(result);
}
这是我在回调方法中调用OnNext
函数的地方。
我正在查看的另一种方法是调用Observable.Start
并订阅返回的observable,但是我不认为这是可行的方法。
我也可以将通话包裹在Observable.Create
周围。
所以我的问题是:这个示例是预订发出结果的方法的正确方法吗?
答案 0 :(得分:0)
如果您使用Create
而不是Subject
怎么办?
由于您的API返回的任务可能要等到停止监听后才能完成,因此您可以使用FromAsync
封装该调用,然后为Create
的观察者创建一个闭包。订阅内部的Observable,您就有一个Observable,当订阅该Observable时,它将从StartListeningAsync
回调中产生结果,直到关联的任务完成(或出错)为止。
Observable.Create((observer, outerCancel) =>
Observable.FromAsync(innerCancel =>
speechService.StartListeningAsync(
observer.OnNext,
innerCancel,
observer.OnError,
interimResults
))
.Subscribe(observer, outerCancel)
);