メッセージを受信するたびに発生する MessageReceived イベントを持つチャット セッション クラスがあります。セッション クラスには、セッションを閉じてそれ以上メッセージが受信されないようにするための切断イベントもあります。
public class Session
{
event EventHandler<string> MessageReceived;
public void Disconnect();
}
セッションの MessageReceived イベントをサブスクライブし、ハンドラーでメッセージをデコードし、それを使用してアプリケーションを更新します。たとえば、特定のユーザーに関する更新やユーザーの参加に関するメッセージなどをメッセージに含めることができます。
アプリケーションを閉じるには、まず MessageReceived イベントのサブスクライブを解除してから、Disconnect を呼び出します。次に、アプリケーションが使用するすべてのリソースをクリーンアップして破棄します。
よく考えないと、MessageReceived のサブスクライブを解除して Disconnect を呼び出したからといって、これ以上 MessageReceived イベントを発生させることはできないと思うかもしれません。これは明らかにそうではありません。サブスクライブを解除して Disconnect を呼び出す直前に、イベント ハンドラーが既に開始されている可能性は十分にあります。
ここでの問題は、Disconnect を呼び出した後、アプリケーション リソースのクリーンアップと破棄に進むことですが、これらは MessageReceived ハンドラー内で仮想的にアクセスできるリソースと同じであることです。未処理の例外が発生するのを待っています。
切断を呼び出した後、ティアダウンを続行する前に、イベント ハンドラーが再度呼び出されないようにしたいと考えています。
この状況でのベスト プラクティスについて教えてください。できれば、この状況が発生して対処される .NET フレームワークの例を指摘してください。
ありがとうございました