0

ここで質問した問題のバリエーションに遭遇しました。クラスを拡張する代わりに、イベントを持たないSystem.Windows.Formクラスを拡張します。System.Windows.UserControlFormClosing

Closeユーザー コントロールにメソッドを追加して、ネイティブ スレッドに停止を指示することを考えました。停止すると、それDispose自体を呼び出すユーザー コントロールにイベントを発生させます。このアプローチの問題はDispose、オブジェクトから呼び出して破棄する (自殺?) ことは悪い習慣のように思われ、(二重破棄を避けるために) 何もしないファイナライザーを作成する必要があり、さらに気分が悪くなります...

提案?

更新:私のユーザー コントロールは を拡張するクラス内に存在しSystem.Windows.Forms.ToolStripControlHost、そのクラスのインスタンスはメイン アプリケーション フォームに存在します。

4

1 に答える 1

1

ユーザーコントロールにある種のメソッドを追加し、フォームFormClosingイベントで呼び出します...

ユーザー コントロールのメソッドは、破棄が完了するまで返されないようにブロックされます。

ただし、Closing イベントでクローズをキャンセルし、フォームを無効にし、バックグラウンドで何かを実行し、完了したらコードからフォームを閉じることができます。例えば:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // if disposed, close as usual
    if (myControl == null || myControl.Disposed) return;
    // disable the form so nothing can be done while
    // were asynchronously disposing the form...
    this.Enabled = false;
    e.Cancel = true;
    var context = TaskScheduler.FromCurrentSynchronizationContext();
    Task.Factory.StartNew(()=>myControl.Dispose())
        .ContinueWith(a=>Close(), context);
}
于 2012-05-16T20:16:36.450 に答える