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