Tor*_*eli 20 .net c# ienumerable reactive-programming system.reactive
在每一篇技术讲座中,或者在每篇博文中,我都读过有关IEnumerable和IObservable的内容,我读过, IEnumerable是基于拉式的结构, IObservable是基于推送的结构.
我已经读过IObservable,我们有异步调用,没有任何东西被阻止,一切都是基于推送的.
但是,但是,但是...
它到底意味着什么?推动基础和拉基于
因为在我看来IEnumerable中我们也可以将数据推送到结构中并从中提取数据,我真的迷失在那些技术术语和想法中.
请以正常和人性的方式向我解释这两种结构之间的区别以及基于推进和基于拉的结构之间的区别.
谢谢.
Eri*_*ert 25
请以正常和人性的方式向我解释差异
好吧,让我们做一些祝酒词.这是我做的最正常的人.
拉基:
// 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.
你想要拉一个结果,你调用一个函数,在函数返回之前你什么都不做.
您希望将结果推送给您,调用异步函数并等待结果.当结果可用时,它会在回调处被推送,这将恢复它所需的方法.
IEnumerable<T>只是一系列拉动; 你MoveNext每次想要拉结果时都会打电话给你T.  IObservable<T>只是一系列的推动; 你注册了一个回调,每当有新的回调时就会调用它T.
换句话说:   IEnumerable<T>逻辑上是一系列Func<T> 调用.  IObservable<T>逻辑上是一系列Task<T> 延续.不要让它们序列混淆你的事实; 那是偶然的.基本思想是功能是同步的; 你打电话给他们并同步得到一个结果; 如果需要一段时间,你就等 任务是异步的; 启动它们并在可用时异步获取结果.  
这个想法存在于C#之前IObservable和之中await.另一种观察方式是:基于拉取的就像函数调用一样,基于推送的就像是事件处理程序.一个普通的函数调用,你想要的时候调用它.一个事件处理程序,当事情发生时它会调用你.  事件是C#语言本身如何表示观察者模式.但事件总是在逻辑上形成一个序列,因此能够操纵一系列推送项目是有意义的,就像我们操纵一系列拉动项目一样.因此,IObservable被发明了.
一个男人走进一家杂货店,问店主是否有鸡蛋。“是的,”店主说。“我可以要一些吗?” 男人问道。店主给了男人一些鸡蛋。“你还有吗?” 男人问道。“是的,”店主说。“我可以要一些吗?” 男人问道。店主给了男人一些鸡蛋。“你还有吗?” 男人问道。“不,”店主说。男人离开。
那是基于拉的。该男子不断地从店主那里“拉”鸡蛋,直到没有鸡蛋为止。
一个男人走进一家杂货店,问店主是否可以送货上门,如果可以,他可以在什么时候送货。“是的,”店主说。男人离开。几天后,一些鸡蛋到了。几天后,一些鸡蛋到了。然后该男子打电话给店主并要求停止送货。没有更多的鸡蛋到达。
那是基于推送的。男人不等店主给他鸡蛋。男人开始做其他事情,店主将鸡蛋“推”给男人。
假设(逻辑)服务器和客户端,谁来确定何时传递数据,服务器还是客户端?
基于请求的描述了一个客户端运行的方案:客户端发出请求,并立即提供数据。基于推送的描述了一种服务器运行的方案:客户端可以连接到推送流(IObservable),但是他们不能要求数据,而是在服务器希望提供数据时获得数据。
拉取的典型形式是数据库查询:将请求发送到服务器,然后服务器以一系列项目作为响应。推送应用的典型版本是聊天应用程序:聊天客户端无法“请求”新的对话数据,服务器会在对方说了什么时告诉您。