1

やあ、

Application.Exit中に実行される次のコードがあります。

            if (InvokeRequired && this.IsHandleCreated)
            {
                this.Invoke(new Action(() => EndUpdate(Caller)));
                return;
            }

これにより、例外がスローされます。ウィンドウハンドルが作成されるまで、コントロールでInvokeまたはBeginInvokeを呼び出すことはできませんが、アプリケーションが実行されている場合に限ります。

奇妙な部分は、デバッガーがエラーのために壊れたときに、InvokeRequiredとIsHandledCreatedの両方がfalseに設定されているので、内部コード(this.Invoke)に到達する方法がわからないことです。

この場合、例外なくアプリケーションを閉じたいだけです。

4

1 に答える 1

0

そのように条件をチェックすることは、スレッドセーフではありません。まず、スレッドがif演算子とInvokeの呼び出しの間で切り替わると、競合状態に陥る可能性があります。それ以外の場合は、ここに同期を入れることをお勧めしますが、フレームワーク コード内に入ることができません。

また、Invokeはクエリを UI メッセージ キューに入れ、UI スレッドはそれをキューから抽出して実行します。一方、 Invoke は UI スレッドがForm.Handleを使用してこのクエリの実行を終了するまで待機します。そのため、 EndUpdateメソッド内でForm.Close ()を呼び出していないことを確認してください。これにより、待機中に例外が発生する可能性があります。

EndUpdate () 呼び出しをForm.OnClosing () オーバーライド内に配置することをお勧めします。これはスレッドセーフであり、Handleが存在することが保証されています。

于 2012-06-29T11:47:58.750 に答える