c# – 使用被动扩展以正确的顺序处理多个响应
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用被动扩展以正确的顺序处理多个响应,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2827字,纯文字阅读大概需要5分钟。
内容图文
![c# – 使用被动扩展以正确的顺序处理多个响应](/upload/InfoBanner/zyjiaocheng/773/da35ad2b716d446383a5a0a0340f1afb.jpg)
情况
我有一个系统,其中一个请求产生两个响应.请求和响应具有相应的可观察量:
IObservable<RequestSent> _requests;
IObservable<MainResponseReceived> _mainResponses;
IObservable<SecondResponseReceived> _secondaryResponses;
保证RequestSent事件早于MainResponseReceived和SecondaryResponseReceived发生,但响应按随机顺序排列.
是)我有的
最初我想要处理两个响应的处理程序,所以我压缩了observables:
_requests
.SelectMany(async request =>
{
var main = _mainResponses.FirstAsync(m => m.Id == request.Id);
var secondary = _secondaryResponses.FirstAsync(s => s.Id == request.Id);
var zippedResponse = main.Zip(secondary, (m, s) => new MainAndSecondaryResponseReceived {
Request = request,
Main = m,
Secondary = s
});
return await zippedResponse.FirstAsync(); ;
})
.Subscribe(OnMainAndSecondaryResponseReceived);
我需要的
现在我需要处理MainResponseReceived而不等待SecondaryResponseRecieved并且必须保证,OnMainResponseRecieved在调用OnMainAndSecondaryResponseReceived之前完成
请问如何定义这两个订阅?
测试案例1:
> RequestSent发生
> MainResponseReceived发生 – >调用OnMainResponseReceived
>发生SecondaryResponseReceived – >调用OnMainAndSecondaryResponseReceived
测试案例2:
> RequestSent发生
>发生SecondaryResponseReceived
> MainResponseReceived发生 – > OnMainResponseReceived被称为 – >调用OnMainAndSecondaryResponseReceived
解决方法:
我认为你几乎走在正确的轨道上.我会停止使用所有Async的东西 – 这只是让事情复杂化.
试试这个查询:
var query =
_requests
.SelectMany(request =>
_mainResponses.Where(m => m.Id == request.Id).Take(1)
.Do(m => OnMainResponseReceived(m))
.Zip(
_secondaryResponses.Where(s => s.Id == request.Id).Take(1),
(m, s) => new MainAndSecondaryResponseReceived()
{
Request = request,
Main = m,
Secondary = s
}));
var subscription =
query.Subscribe(x => OnMainAndSecondaryResponseReceived(x));
.Do(…)是代码中重要的缺失部分.它确保在OnMainAndSecondaryResponseReceived之前调用OnMainResponseReceived,无论主响应或辅助响应是否首先出现.
我测试了这个:
Subject<RequestSent> _requestsSubject = new Subject<RequestSent>();
Subject<MainResponseReceived> _mainResponsesSubject = new Subject<MainResponseReceived>();
Subject<SecondResponseReceived> _secondaryResponsesSubject = new Subject<SecondResponseReceived>();
IObservable<RequestSent> _requests = _requestsSubject.AsObservable();
IObservable<MainResponseReceived> _mainResponses = _mainResponsesSubject.AsObservable();
IObservable<SecondResponseReceived> _secondaryResponses = _secondaryResponsesSubject.AsObservable();
_requestsSubject.OnNext(new RequestSent() { Id = 42 });
_mainResponsesSubject.OnNext(new MainResponseReceived() { Id = 42 });
_secondaryResponsesSubject.OnNext(new SecondResponseReceived() { Id = 42 });
_requestsSubject.OnNext(new RequestSent() { Id = 99 });
_mainResponsesSubject.OnNext(new MainResponseReceived() { Id = 99 });
_secondaryResponsesSubject.OnNext(new SecondResponseReceived() { Id = 99 });
内容总结
以上是互联网集市为您收集整理的c# – 使用被动扩展以正确的顺序处理多个响应全部内容,希望文章能够帮你解决c# – 使用被动扩展以正确的顺序处理多个响应所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。