私はいくつかのプロジェクトでプログラムを作成していますが、いくつかのプロジェクトはログを記録するためにメインプロジェクトメッセージに戻って報告します。C#:内部動作:イベント、Control.BeginInvokeおよびプログラム終了=割り込み?
私はAsynchソケットを使用しているので、これらのメッセージのいくつかは別のスレッドに戻ってくるので、メインスレッドに着くとInvokeRequiredをチェックし、trueならthis.BeginInvokeを使ってロギングを処理します。
サーバーの場合は特にUIスレッドで処理する必要があります。ここでは、ListBoxで最後にログに記録されたメッセージを表示するので、テスト中に操作の進行状況を確認できます。
いくつかのメッセージが切り替わる可能性があることは時々わかりますが、今のところ私はそれで生きることができます。何らかの理由でBeginInvokeの代わりにInvokeを使用すると、クライアントが接続されている間にサーバーを停止するとクラッシュし、例外も発生しません。しかし、私はBeginInvokeを使用してこれを克服しました。
私の質問は、プログラムの終了時にイベントとBeginInvokeがどのように機能するかを理解することです。イベントがキューに入っている場合、またはBeginInvokeがプログラムの終了直前に呼び出された場合は、即座に終了し、すべてを取り消しますか?私の場合、保留中のメッセージをログに記録して終了するか、すべての保留中のアクションを実行しますか?
フォームが破棄されると、呼び出しキューがフラッシュされるため、残りの操作(ログ)は実行されません。これは問題を解決するものではありません。呼び出しがもう発生しないことが確実になるまで、フォームを閉じることを許可することはできません。たとえば、ソケットを最初に閉じます。 –
私は最初にソケットを閉じます - それは私のログイベントが発生したときです - ソケットが閉じられたことを記録する - 私の質問は、プログラムが閉じられる前にログが常に処理されるか、まだ待ち行列に入っていないか、またはbegininvokeがまだ行われていません。ソケットの廃棄には関係ありません。 – 537mfb
フォームが破棄されると、呼び出しキューがフラッシュされます。実行中ではなく、保留中の呼び出しを削除する*。 –