我有一个聊天会话类,它有一个 MessageReceived 事件,每当收到消息时就会引发该事件。会话类还有一个 Disconnect 事件来关闭会话并防止接收更多消息。
public class Session
{
event EventHandler<string> MessageReceived;
public void Disconnect();
}
我订阅了 Session 的 MessageReceived 事件,并在我的处理程序中解码消息,然后使用它来更新应用程序 - 例如.. 一条消息可能包含有关特定用户的更新,或有关用户加入的消息等。
当我想关闭我的应用程序时,我要做的第一件事就是取消订阅 MessageReceived 事件,然后调用 Disconnect。然后我开始清理和处理应用程序使用的所有资源。
现在,如果我没有考虑太多,我可能会假设仅仅因为我取消了 MessageReceived 的订阅并调用了 Disconnect,就不可能再引发任何 MessageReceived 事件。显然情况并非如此。完全有可能在我取消订阅并调用 Disconnect 之前,事件处理程序已经启动。
这里的问题是,在我调用 Disconnect 之后,我会继续清理和处置应用程序资源,但这些资源与我的 MessageReceived 处理程序中可以假设访问的资源相同。这是一个等待发生的未处理异常。
在我调用 Disconnect 之后,我想确定在继续拆卸之前不会再次调用事件处理程序。
SO可以请告诉我在这种情况下的最佳实践是什么,并最好指出.NET框架中遇到和处理这种情况的示例。
谢谢