一个班级Receiver
收到udp数据报(每秒超过1000个数据报)。
要成为OOP,我应该在Receiver
public event EventHandler<NewDatagramEventArgs> NewMessage;
protected virtual void OnNewMessage(NewDatagramEventArgs e)
{
if (NewDatagram != null)
NewDatagram(this, e);
}
....
socket.Receive(result)
....
OnNewMessage(new NewDatagramEventArgs(result));
.....
然后我可以将任意数量的Consumers
附加到此类以获得有关新数据报的通知。
在实践中,我总是只有一个消费者,所以我可以写:
socket.Receive(result);
Consumer.Instance.NewDatagram(result);
我非常需要快速做事,因为它是交易软件,每增加一毫秒就是额外的钱。
第一种方法慢多少? 第二种方法有多难啊?
答案 0 :(得分:3)
如果逻辑上只有一个接收器,你总是可以将一个委托作为构造函数参数,并将其用作接收器,而不是直接引用一个单例。这样你就可以通过更简单的逻辑进行解耦。
答案 1 :(得分:0)
Delegates perform well,所以我不会太在意这一点。我会描述它,看看是否有明显的差异。
如果确实存在差异,那么消费者/接收者的紧密耦合可能是您唯一的选择(不是一个糟糕的选择 - 它们是合乎逻辑的配对)。
作为旁注,我通过使用一个小的中间存储结构(队列,堆栈等)并按间隔转储传入数据(而不是逐个消息)来获得出色的性能。这可能是也可能不适合您的申请。
答案 2 :(得分:0)
如果真的只有一个接收器,我就不会创建一个事件。但是,我不会直接在接收器中使用消费者。如果没有理由,应该避免紧耦合。
虽然代表工作得很好(如已经建议的那样),但您可能还想考虑使用界面。
由于您的消费者直接响应低级网络事件,或许在某些时候您还希望在其他事件发生时通知它,例如,插座关闭。当您使用界面时,您只需在其中创建一个新方法并在消费者中实现它,您就完成了。如果您只有一个委托,则必须为新事件创建第二个(对于任何其他新事件更多)或让一个委托处理多个事件,这也不是很好。