Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 推式结构和拉式结构(如IEnumerable<;T>;和可观察的<;T>;_C#_.net_Reactive Programming_System.reactive_Ienumerable - Fatal编程技术网

C# 推式结构和拉式结构(如IEnumerable<;T>;和可观察的<;T>;

C# 推式结构和拉式结构(如IEnumerable<;T>;和可观察的<;T>;,c#,.net,reactive-programming,system.reactive,ienumerable,C#,.net,Reactive Programming,System.reactive,Ienumerable,在每一次科技演讲中,或者在我读到的每一篇关于IEnumerable和IOobservable的博客文章中,我都读到了这一点, IEnumerable是基于拉动的结构和 IObservable是基于推送的结构 我已经读到了关于IObservable的文章,我们有异步调用,没有任何东西被阻止,所有东西都是基于推的 但是,但是,但是 这到底意味着什么基于推送和基于拉送 因为在我看来,IEnumerable中,我们也可以将数据推送到结构中,也可以从结构中提取数据,我真的迷失在技术术语和想法中 请以正常和

在每一次科技演讲中,或者在我读到的每一篇关于IEnumerableIOobservable的博客文章中,我都读到了这一点, 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只是“可数”的意思,即一个可数集
  • 观测值也可能是可数的,因为一个观测值可能代表一组离散事件
命名是混乱的,在我看来,很难代表他们想要的概念。例如,在Java世界中,IEnumerable是Iterable,这更接近.NET中的意图

我认为最简单的方法是将IEnumerable及其周围的LINQ构造想象为“从某个源中获取一些数据,并像这样对它们进行过滤/分组…”,而可观测数据可以被认为是可以响应的传入流。我不认为将可观测视为连续性是必要的

一名男子走进一家杂货店,问店主是否有鸡蛋。“是的,”店主说。“我可以要一些吗?”男人问。店主给了他一些鸡蛋。“你还有吗?”男人问。“是的,”店主说。“我可以要一些吗?”男人问。店主给了他一些鸡蛋。“你还有吗?”男人问。“不,”店主说。那人走了

这是基于拉力的。那人不停地从店主那里“拉”鸡蛋,直到一个也没有剩下

一名男子走进一家杂货店,问店主他是否可以送货,如果可以,他什么时候能拿到鸡蛋都可以送货。“是的,”店主说。那人走了。几天后一些鸡蛋就到了。几天后,一些鸡蛋到达。然后,这名男子打电话给店主,要求店主停止送货。没有更多的鸡蛋到达

这是基于推送的。这个人没有等店主给他鸡蛋。这个人到处做som