C# 事件传递类到第三级类

时间:2021-03-11 16:14:58

标签: c# events

好的,这是我的用例。

我编写了一个 MMO 服务器游戏引擎,我现在的架构方式主要是 EDA。当服务器收到来自客户端的数据包时,核心服务器发布一个其他类订阅的事件,该事件在 EventType e 参数中携带数据包有效负载。消息在消息的第一个字节中有一个头,字节的前半部分携带按位信息,决定哪个类应该接收消息并用它做一些事情,而字节的后半部分确定类中的哪个方法需要处理消息。而那些不应该处理任何东西的类就会丢弃它。

这个评估是通过对每个类的一系列 if 语句完成的,首先询问...if (headervalue != myexpectedheader) return; ... 为清楚起见,它实际上是一个 double if (lessthan) || (超过)回报;因为可能属于我的头值集是一个范围,因为字节的前半部分寻址类,而字节的后半部分寻址方法,所以类不能真正评估“我的东西”,而是“什么不是我的”,以便将 if 语句保持在条件集的顶部,因为它更有可能不是我的,而不是我的。这可以正常工作。评估标头并确定有效负载的类是为它准备的,它完美无缺,而那些不应该......没有。这部分我不需要帮助,只是要求我解释一下,让其他人理解。

因为这是一个 MMO 服务器,预计会在网络密集型活动期间接收、处理和响应可能有数千个用户每秒发送数百个数据包,所以我担心有大量的类对收到的每条消息执行条件评估来自无数的客户。

将此与这样一个事实相结合:收到的消息中 90% 到 95% 很可能应该被一两个类接收。因此,每个班级都将浪费大量系统时间来评估“不适合我”,尤其是因为 90% 的消息可能会发送到最常用的班级。

因此,我正在尝试构建一个消息路由器,该路由器将订阅核心服务器类上的传入消息事件,对每条消息执行“哪个类”条件仅评估一次,并在评估后发布新事件,以便仅真正需要使用该事件的一两个其他类可以订阅该新事件并消除大量浪费的评估,这些评估基本上会导致“如果(不适合我)返回;”

问题的范围实际上总结如下,上面写的内容不在实际问题的范围内,这只是对如何进行评估的解释,以及为什么这个用例使问题相关。

我有一个 A 类,它有一个主要事件。该事件将非常迅速地触发。我有大量 C 类需要潜在地接收来自 A 类事件的信息。但是,因为我有大量 C 类订阅者,所以我想创建一个 B 类中间人作为事件路由器,以减少 A 类直接订阅者的数量(以及系统开销)

我希望 B 类订阅 A 类,C 类订阅 B 类,最终结果是正确的 C 类有效地从 A 类接收了事件。

我已经编写了对事件进行排序的逻辑,但我不知道如何编写传递事件,以便 C 类订阅者通过侦听 B 类事件来消费 A 类事件。

1 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了问题,但从某个地方开始,这里有一个我认为您要求的示例(请参阅 fiddle 进行测试:https://dotnetfiddle.net/abEgV4):

miktex

这是否涵盖了问题,或者您能否详细说明缺少的内容?