请问处理程序我的事件立即返回是否可以?

我正在写一个.NET库。 其中一个类具有库的用户需要订阅的事件。 可以问这些事件的处理程序实现快速返回吗? 或者这是一个常见的问题,有一个共同的解决方案?

(如果处理程序需要很长时间也不会致命 – 但是如果他们的处理程序需要的时间超过半秒,事情就会开始出错 – 这是一个网络库,并且连接的对等体会认为这个对等体已经丢失了发送回复的主题)

例如

public delegate void Ping(); class A { ///  /// If your handler doesn't return quickly... I am going to cry. ///  public event Ping Ping; private void RaisePing() { var handler = Ping; if(handler != null) handler(); } // this is called several times a secound private void MainLoop() { if(something) RaisePing(); // time important stuff - musn't take long to get here... } } 

请问处理程序我的事件立即返回是否可以?

是。

您应该在文档中明确声明如果订阅者没有及时返回,库将无法正常工作。

你不应该强制执行它

为什么? 因为你说你正在开发一个库。 与框架相对的库使用户处于控制之下。 因此,用户决定在订阅您的活动时做他们想要的事情。

强制执行处理程序只会增加复杂性,使库更难使用。 这就是为什么我认为最好能够清楚地表达期望,如果他们因处理器速度慢而遇到问题,只需将用户引用到文档中。

如果处理程序快速返回对您的代码至关重要,则应该在允许您取消处理程序的结构上构建它。 由于事件处理程序不允许您取消处理程序的执行,例如超时,因此您可以使用以下选项:

  • 使用事件处理程序并接受您无法控制调用者的操作。 当然,您可以要求呼叫者在特定时间范围内返回,但您应该做好准备,有时他们不会。 但是,您可以构造代码,以便在代码中的某个位置调用事件处理程序,这些时间不是时间关键的(例如,在您的示例中,在引发前移动“Time important stuff”)或使用线程来允许并行执行。
  • 如果您不需要事件的特殊特性(例如订阅模型,订阅多个处理程序),您可以使用允许您取消处理程序的替代方法。 根据您使用的Framework版本,替代方法可能是使用调用者为类提供的类似于回调函数的任务。 任务允许您等待特定的毫秒数完成。

我个人认为这是一个坏主意 – 因为Windows不是实时操作系统。 在非实时操作系统中,您不能指望执行0.5秒的某些方法。