C# 推式结构和拉式结构(如IEnumerable<;T>;和可观察的<;T>;
在每一次科技演讲中,或者在我读到的每一篇关于IEnumerable和IOobservable的博客文章中,我都读到了这一点, IEnumerable是基于拉动的结构和 IObservable是基于推送的结构 我已经读到了关于IObservable的文章,我们有异步调用,没有任何东西被阻止,所有东西都是基于推的 但是,但是,但是 这到底意味着什么基于推送和基于拉送 因为在我看来,IEnumerable中,我们也可以将数据推送到结构中,也可以从结构中提取数据,我真的迷失在技术术语和想法中 请以正常和人性化的方式向我解释这两种结构之间的区别,以及推式结构和拉式结构之间的区别 谢谢 请以正常和人性化的方式向我解释两者的区别 好的,让我们做些烤面包。这是我做的最正常的人类事情 拉式:C# 推式结构和拉式结构(如IEnumerable<;T>;和可观察的<;T>;,c#,.net,reactive-programming,system.reactive,ienumerable,C#,.net,Reactive Programming,System.reactive,Ienumerable,在每一次科技演讲中,或者在我读到的每一篇关于IEnumerable和IOobservable的博客文章中,我都读到了这一点, IEnumerable是基于拉动的结构和 IObservable是基于推送的结构 我已经读到了关于IObservable的文章,我们有异步调用,没有任何东西被阻止,所有东西都是基于推的 但是,但是,但是 这到底意味着什么基于推送和基于拉送 因为在我看来,IEnumerable中,我们也可以将数据推送到结构中,也可以从结构中提取数据,我真的迷失在技术术语和想法中 请以正常和
// I want some toast. I will pull it out of the toaster when it is done.
// I will do nothing until the toast is available.
Toast t = toaster.MakeToast();
t.AddJam();
// Yum.
基于推送的:
// I want some toast. But it might take a while and I can do more work
// while I am waiting:
Task<Toast> task = toaster.MakeToastAsync();
Toast t = await task;
// await returns to the caller if the toast is not ready, and assigns
// a callback. When the toast is ready, the callback causes this method
// to start again from this point:
t.AddJam();
// Yum.
//我想要些吐司。但这可能需要一段时间,我可以做更多的工作
//在我等待的时候:
Task=toaster.maketoastatsync();
Toast t=等待任务;
//如果吐司没有准备好,wait返回给调用者,并分配
//回拨。当toast准备就绪时,回调将导致此方法
//要从这一点重新开始:
t、 AddJam();
//好吃。
你想得到一个结果,你调用一个函数,在函数返回之前你什么也不做
如果希望将结果推送到您的计算机上,您可以调用一个异步函数并等待结果。当结果可用时,会在回调处推送它,从而在需要的地方恢复方法
IEnumerable
只是一个拉取序列;每次要提取结果时,您都会调用MoveNext
,得到T
IObservable
只是一个推送序列;您注册了一个回调,每次有新的T
可用时都会调用它
换句话说:IEnumerable
在逻辑上是一系列Func
调用<代码>IObservable在逻辑上是一系列任务的延续。不要让它们是序列的事实迷惑你;那是偶然的。基本思想是功能是同步的;您调用它们并同步获得结果;如果需要一段时间,你就等。任务是异步的;启动它们并在结果可用时异步获取结果
这种想法存在于C#before
IObservable
和wait
中。另一种方法是:基于拉的类似于函数调用,基于推的类似于事件处理程序。一个普通的函数调用,当你想要什么的时候调用它。一个事件处理程序,它在发生事件时调用您事件是C语言本身表示观察者模式的方式。但是事件总是在逻辑上形成一个序列,所以能够像处理拉式项目序列一样处理推式项目序列是有意义的。因此,IObservable
被发明了。假设有一个(逻辑)服务器和一个客户机,谁来决定何时交付数据,服务器还是客户机
Pull-based描述了一种客户机运行方案:客户机发出请求,然后立即提供数据。Push-based描述了一种服务器运行模式:客户端可以连接到一个Push流(IObservable),但是他们不能要求数据,当服务器想要提供数据时,他们就可以得到数据
拉取的一种规范形式是数据库查询:您向服务器发送一个请求,服务器用一组项进行响应。推送的标准版本是一个聊天应用程序:聊天客户端不能“要求”新的对话数据,当其他人说了什么时,服务器会告诉你。除了上面的精彩答案外,我还提供以下内容:
- 在.NET framework概念模型中,“IEnumerable”意味着“enumerable”与“pull-based”被含蓄地混淆。它的意思是“允许您获取一个枚举数,它允许您提取下一个值”
- 但我们也有一个数不清的李>
- 从数学上讲,enumerable只是“可数”的意思,即一个可数集
- 观测值也可能是可数的,因为一个观测值可能代表一组离散事件