其他分享
首页 > 其他分享> > CodeGo.net>使用IObservable实现异步方法

CodeGo.net>使用IObservable实现异步方法

作者:互联网

使用返回IObservable的方法来实现标准“ Being / End”异步模式的替代方法是否合理?在下面的代码中,我将使用Rx包装旧版API,以为其提供更好的接口.

API上的Messages属性是一个热门的IObservable.我的问题是我认为如果在返回过滤响应的IObservable之前获得响应消息(即m.RequestId == requestId),则订阅者将看不到它并且不会知道操作已完成.

有没有办法正确地做到这一点?

    public IObservable<bool> DoAsyncRequest()
    {
        Observable.Defer(delegate
        {
            int requestId = GenerateRequestId();

            this.api.DoApiRequest(requestId);

            return this.api.Messages
                .Where(m => m.RequestId == requestId)
                .Take(1)
                .Timeout(DefaultTimeout);

        });
    }

解决方法:

首先,绝对可以返回IObservable来实现异步方法.

其次,如果启动了通过消息发出值的过程的DoApiRequest方法,则可以先订阅消息,然后再使用CreateWithDisposable调用该方法

public IObservable<bool> DoAsyncRequest()
{
    return Observable.CreateWithDisposable<bool>(observer =>
        {    
            var disposable = this.api.Messages
                .Where(m => m.RequestId == requestId)
                .Take(1)
                .Timeout(DefaultTimeout);
                .Subscribe(observer);

            int requestId = GenerateRequestId();

            this.api.DoApiRequest(requestId);

            return disposable;

        });
}

另外,由于您似乎可以访问api对象的任何类,因此您也可以更改DoApiRequest以返回冷的可观察值,即可以废弃Messages属性,而是在DoApiRequest方法上返回IObservable.

注意

如果我正确地假设DoApiRequest方法确实启动了通过Messages发出值的过程,那么如果多次调用此方法,您将得到奇怪的结果.一个呼叫可以获取原本打算为另一个呼叫返回的消息.如果可以的话,我会亲自研究替代解决方案.

标签:system-reactive,asynchronous,c
来源: https://codeday.me/bug/20191208/2092448.html