C# 使用IObservable实现异步方法

C# 使用IObservable实现异步方法,c#,asynchronous,system.reactive,C#,Asynchronous,System.reactive,使用返回IObservable的方法来实现标准Being/End异步模式的替代方案是否合理?在下面的代码中,我将使用Rx包装一个遗留API,以提供更好的接口 API上的Messages属性是一个热IObservable。我的问题是,如果我在返回过滤响应的IObservable之前收到响应消息(即m.RequestId==RequestId),订阅者将看不到它,也不知道操作已完成 有没有办法做到这一点 public IObservable<bool> DoAsyncReques

使用返回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);

        });
    }
public-IObservable-DoAsyncRequest()
{
可观察的。延迟(委托)
{
int requestId=GenerateRequestId();
this.api.DoApiRequest(requestId);
返回this.api.Messages
.Where(m=>m.RequestId==RequestId)
.采取(1)
.超时(默认超时);
});
}

首先,返回一个IObservable来实现异步方法是绝对正确的

其次,如果是
DoApiRequest
方法启动了通过
Messages
发出值的过程,那么您可以先订阅消息,然后使用
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;

        });
}
public-IObservable-DoAsyncRequest()
{
返回Observable.CreateWithDisposable(观察者=>
{    
var disposable=this.api.Messages
.Where(m=>m.RequestId==RequestId)
.采取(1)
.超时(默认超时);
.签署(观察员);
int requestId=GenerateRequestId();
this.api.DoApiRequest(requestId);
一次性退货;
});
}
或者,由于您似乎可以访问api对象所属的任何类,因此您还可以更改DoapRequest以返回冷可观测值,即可能放弃Messages属性,而在DoapRequest方法上返回IObservable

注意

如果我正确地假设DoApiRequest方法确实启动了通过消息发送值的过程,那么如果多次调用该方法,您将得到奇怪的结果。一个呼叫可能会收到预期将在另一个呼叫中返回的消息。如果你能的话,我个人会研究其他的解决方案