Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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# 投票有什么问题?_C#_.net_Asp.net_Polling - Fatal编程技术网

C# 投票有什么问题?

C# 投票有什么问题?,c#,.net,asp.net,polling,C#,.net,Asp.net,Polling,我最近听到一些开发人员说,他们只是轮询一些东西(数据库、文件等),以确定什么时候发生了更改,然后运行一个任务,例如导入 我真的反对这个想法,并认为利用现有的技术,如,等将远远优于投票 然而,我想找出为什么其他人喜欢一种方法而不是另一种方法的原因,更重要的是,我如何才能说服其他人在这个时代投票是错误的?投票本身并不是“错误的” 这在很大程度上取决于它是如何实现的以及目的是什么。如果你真的关心即时的变更通知,这是非常有效的。您的代码处于紧密循环中,不断轮询(询问)资源是否已更改/更新。这意味着您会尽

我最近听到一些开发人员说,他们只是轮询一些东西(数据库、文件等),以确定什么时候发生了更改,然后运行一个任务,例如导入

我真的反对这个想法,并认为利用现有的技术,如,等将远远优于投票

然而,我想找出为什么其他人喜欢一种方法而不是另一种方法的原因,更重要的是,我如何才能说服其他人在这个时代投票是错误的?

投票本身并不是“错误的”


这在很大程度上取决于它是如何实现的以及目的是什么。如果你真的关心即时的变更通知,这是非常有效的。您的代码处于紧密循环中,不断轮询(询问)资源是否已更改/更新。这意味着您会尽快收到通知,告知您有不同之处。但是,您的代码没有执行任何其他操作,而且对所讨论的对象的许多调用都会产生开销

如果您不太关心即时通知,您可以增加轮询之间的间隔,这也可以很好地工作,但选择正确的间隔可能很困难。时间太长,您可能会错过关键的更改;时间太短,您又回到了第一种方法的问题

在这些情况下,诸如中断或消息等替代方案可以提供更好的折衷方案。您会在实际可行的情况下尽快收到更改通知,但这种延迟不是您可以控制的,它取决于组件本身是否及时传递状态更改

投票“错”在哪里

  • 这可能会占用资源
  • 它可能是有限的(特别是如果你有很多事情想知道/投票)
  • 这可能太过分了
但是

  • 这并不是天生的错误
  • 这可能非常有效
  • 这很简单

    • 轮询很容易,非常简单,它和任何程序代码一样简单。不轮询意味着你进入了异步编程的世界,这并不是一件容易的事,有时甚至会变得很有挑战性

      与任何系统中的任何东西一样,阻力较小的路径通常更常见,因此总会有程序员使用轮询,甚至是伟大的程序员,因为有时不需要使用异步模式使事情复杂化


      就我个人而言,我总是努力避免轮询,但有时我还是会进行轮询,特别是当异步处理的实际收益不太大时,比如在处理一些小的本地数据时(当然,您的速度会快一点,但用户不会注意到这种情况下的差异)。所以这两种方法都有空间。这并不是在回答你的问题。但实际上,特别是在这个处理器周期便宜、带宽大的“时代”,轮询对于某些任务来说实际上是一个非常好的解决方案

      好处是:

      • 便宜的
      • 可靠的
      • 可测试
      • 灵活的

      如果您正在轮询文件的更改,那么我同意您应该使用文件系统通知,这种通知在发生这种情况时可用,现在大多数操作系统都可以使用

      在数据库中,您可以在更新/插入时触发,然后调用外部代码来执行某些操作。然而,这可能只是因为您不需要立即采取行动。例如,您可能只需要在15分钟内将数据从数据库A传输到另一个网络上的数据库B。数据库B可能无法从数据库A访问,因此您最终只能从数据库B进行轮询,或者作为独立程序在数据库B附近运行


      此外,投票是一个非常简单的程序。这通常是在时间限制很短的情况下完成的第一步实现,因为它工作得很好,所以它仍然有效。

      原则上,轮询被认为是不好的原因有两个

    • 这是对资源的浪费。您很可能会在未发生更改时检查更改。在这项操作上花费的CPU周期/带宽不会导致变化,因此本可以更好地花在其他事情上

    • 轮询是在一定的时间间隔内完成的。这意味着您在下一次间隔时间过去之前不会知道发生了更改


    • 最好是通知变更。这样,您就不会轮询尚未发生的更改,并且在收到通知后,您将立即知道更改。

      轮询的关键在于它是有效的!它可靠且易于实现

      池的成本可能很高——如果您每分钟扫描一个数据库以查找更改,而一天只有两次更改,那么您将为一个非常小的结果消耗大量资源

      然而,任何通知技术的问题在于,它们的实现要复杂得多,而且不仅不可靠,而且(这是一个大问题),您无法轻松判断它们何时不工作


      因此,如果您确实放弃了对其他技术的轮询,请确保它对普通程序员是可用的,并且是超可靠的

      它的简单-轮询很糟糕-效率低下,浪费资源等。不管怎样,总会有某种形式的连接在监视某种类型的事件,即使没有选择“轮询”

      那么,为什么要多做一点,多做一些投票呢

      回调是最好的选择——只需担心回调与当前进程的关系。在底层,正在进行轮询,以查看连接是否仍然存在


      如果你一直给你的女朋友打电话,而她从来不接,那为什么还要一直打电话?只要留个口信,等她‘回电’;)

      我同意避免投票是一项好政策。然而,关于,我会说