在C#中重复触发事件的理论速度限制是多少?

在C#中重复触发事件的理论速度限制是多少?,c#,multithreading,events,C#,Multithreading,Events,我即将开始一个项目,其中实时数据传输和可视化是一个核心功能。数字流将通过USB接收并绘制在屏幕上。很可能会监听某种类型的数据接收(一些数据)事件 因此,我有兴趣了解C#中事件触发的理论极限,这样我就可以事先知道是否正在“设计”一个不可能的瓶颈,而这将在以后需要实质性的更改或更严重的问题 以下是一些示例情况: 如果我告诉一个对象运行一个无限循环,它除了触发一个事件外什么都不做,那么触发频率是多少 如果我循环链接相似的对象,使对象B听A.Fired,C听B.Fired,等等,A听N.Fired,那么

我即将开始一个项目,其中实时数据传输和可视化是一个核心功能。数字流将通过USB接收并绘制在屏幕上。很可能会监听某种类型的
数据接收(一些数据)
事件

因此,我有兴趣了解C#中事件触发的理论极限,这样我就可以事先知道是否正在“设计”一个不可能的瓶颈,而这将在以后需要实质性的更改或更严重的问题

以下是一些示例情况:

  • 如果我告诉一个对象运行一个无限循环,它除了触发一个事件外什么都不做,那么触发频率是多少
  • 如果我循环链接相似的对象,使对象B听A.Fired,C听B.Fired,等等,A听N.Fired,那么一整圈需要多少时间?事件链接通常是如何工作的?它们通常是昂贵的还是轻量级的
  • 通过参数传递数据如何影响事件频率性能
  • 作为一个额外的问题:在C#中是否有一个用于实时多线程数据采集的“设计模式”?

    C#事件被调度到它们产生的同一个线程上,因此它将尽可能快地运行计算机。没有调度程序工作,没有唤醒线程。如果不在您的机器上进行测试,频率问题就无法准确回答,而且它确实会随您的机器进行缩放。与处理事件所花费的时间相比,引发事件所花费的时间微不足道

    向事件传递参数与向函数调用传递参数大致相同,JIT决定了低级调用约定。最坏的情况是每个参数都在堆栈上传递

    如果您的设计需要是多线程的,那么您需要更多地关注调度器细节和线程间通信,而不是事件性能


    最后,对我来说,使用C#并关注如此低级的细节让我感到奇怪。实时系统的定义是一个保证响应时间的系统,而C#被垃圾收集,你不能对响应时间做出很强的保证。如果您非常担心将参数传递给函数的成本,我认为您应该考虑使用其他语言来实际控制这些细节。

    理论上没有限制。唯一的限制是CPU的工作速度……我自己对此的看法(基于以前编写驱动程序的经验)是这两个动作应该是不相交的。事件的收集应该是高吞吐量的,并且专门用于接收数据。而事件的消耗应该异步完成。这样,消费速度就不会成为接收的瓶颈。所以我不会使用clr事件来处理基于硬件的实时信号。这一点你自己很难理解。只要在for()循环中引发一个事件一百万次,就可以使用秒表查看它花费了多长时间。无论你发现什么,都比USB传输数据快得多。如果你不知道一个典型的事件处理程序处理数据需要多长时间,那就没用了。我可能会使用RTOS而不是Windows。我不太熟悉实时/多线程术语,但我想我的系统不是严格意义上的实时,但我当然希望它比通过USB传输数据更快地消耗数据。你的回答清楚地表明,活动筹办是一个非常轻量级的操作,我不需要为此担心。