2009-09-29 39 views
0

何时适合在C#中引发事件?何时使用自定义c#事件

作为一个例子,在我们的系统中,我们有数据对象从外部系统发送给我们,比如每分钟50次。在收到数据包后,我们需要让它由另一个对象处理。在这种情况下使用事件或简单的方法调用会更好吗?

一个事件看起来很直观,但我不清楚它与单纯使用常规方法调用相比有什么优点。

回答

4

当不适合源自动作的代码直接了解对该动作作出反应的代码时,应该使用事件。

一方面,这里的事件听起来很合适,因为处理数据接收的代码不应该依赖于执行与所述数据有关的代码的实现。否则,数据接收代码现在负责两件事 - 接收数据委托其处理。另一方面,如果数据的特定处理与外部调用者发送的行为直接相关,则将其作为函数调用可能更有意义。我们的问题中没有足够的信息可以肯定地说出来。

0

在这种情况下,事件没有意义。事件倾向于告知正在发生的事情,而不是取代函数调用。它们更具信息性。

因此,您可能需要传递一个Action函数,以便您可以调用传入的函数来执行处理。

这会比函数调用IMO更好。

你可以看一下这个页面的例子: http://www.claassen.net/geek/blog/2007/12/action-func-never-write-another.html

更新:如果你不使用C#3,那么你可能需要使用一个委托来代替,其中,事件处理程序是一个专门的委托。

+1

我不同意“不要替换函数调用”语句。事件处理程序是函数调用。事件旨在用于在代码(函数)以解耦方式满足条件时有机会执行。想想控制;当用户做某事时,他们给命令式代码(函数)提供运行的机会。另外需要注意的是事件处理程序是ARE委托,因此传递一个Action并传递一个EventHandler是一回事;他们只是有不同的签名。话虽如此,我是Action委托类的大用户 – 2009-09-29 00:41:15

+0

从模式角度来看,您所描述的内容几乎与事件相同,除了只需要一个用户。 – 2009-09-29 00:57:42

+0

我倾向于只是传递Action <>函数,因为它摆脱了需要委托,它简化了我的代码,我相信它使它更加灵活。 – 2009-09-29 02:00:32

1

IMO使用队列将是一个合适的第一步。处理Queue的代码反过来可以引发事件或接受一个根据数据对象类型执行不同任务的委托。 Action或Func应该在这里运行得很好。

请记住,当您使用事件时,您必须确保处理程序及时取消注册,否则您可能会泄漏。