C# 使用IObservable实现异步方法
使用返回IObservable的方法来实现标准Being/End异步模式的替代方案是否合理?在下面的代码中,我将使用Rx包装一个遗留API,以提供更好的接口 API上的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
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方法确实启动了通过消息发送值的过程,那么如果多次调用该方法,您将得到奇怪的结果。一个呼叫可能会收到预期将在另一个呼叫中返回的消息。如果你能的话,我个人会研究其他的解决方案