Rx .NET什么是观察函数调用的正确方法

时间:2018-08-23 06:38:49

标签: c# .net reactive-programming system.reactive

我正在学习在.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周围。

所以我的问题是:这个示例是预订发出结果的方法的正确方法吗?

1 个答案:

答案 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)
);