Webサーバーから取得した情報を表示するUserControl派生コントロールがあります。現在、応答性を改善するために、コントロールの初期化を非同期にしています。
LoadイベントハンドラーでCancellationTokenSourceを作成し、関連するトークンをさまざまな非同期呼び出しで使用しています。
非同期操作が完了する前にユーザーがフォームを閉じると、操作がキャンセルされることを確認したいと思います。つまり、トークンでCancelを呼び出したいのです。
私はwhereを理解しようとしています。トラップできるUnloadイベントがあった場合、それは完璧でしょう。しかし、そうではありません。実際、適切なイベントは見つかりません。
I could含まれるフォームのcloseイベントをトラップしますが、UserControlのすべてをローカルに保持したかったのです。
提案?
Control :: HandleDestroyed イベントをお勧めします。基になるHWndが破棄されると(通常、親フォームが閉じられると発生します)発生します。独自のUserControlで処理するには、 OnHandleDestroyed をオーバーライドする必要があります。
コントロールはまだ破棄されていないため、この時点でコントロールのプロパティに完全にアクセスできます。
別の解決策
protected override void OnParentChanged(EventArgs e)
{
base.OnParentChanged(e);
if (parentForm != null)
{
parentForm.Closing -= parentForm_Closing;
}
parentForm = FindForm();
if (parentForm != null)
parentForm.Closing += parentForm_Closing;
}
void parentForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
parentForm.Closing -= parentForm_Closing;
parentForm = null;
//closing code
}
Disposed
イベントを使用しないのはなぜですか?
フォームが閉じられると、フォーム自体でDispose
が呼び出され、すべての子コントロールも再帰的に破棄されます。
これを試して:
UserControl.Dispose();