50

我有一个 UserControl 派生控件,用于显示从 Web 服务器获取的一些信息。我目前正在使控件的初始化异步,以提高响应能力。

在我的 Load 事件处理程序中,我正在创建一个 CancellationTokenSource,并在各种异步调用中使用关联的 Token。

我现在想确保如果用户在异步操作完成之前关闭表单,操作将被取消。换句话说,我想在令牌上调用 Cancel。

我试图弄清楚在哪里做这件事。如果有一个我可以捕获的 Unload 事件,那将是完美的 - 但没有。事实上,我找不到任何看起来合适的活动。

可以捕获包含表单的关闭事件,但我真的想将所有内容都保留在我的 UserControl 本地。

建议?

4

4 回答 4

48

我建议Control::HandleDestroyed事件。它在底层 HWnd 被销毁时引发(通常发生在父窗体关闭时)。要在您自己的 UserControl 中处理它,您应该重写OnHandleDestroyed

此时您可以完全访问控件的属性,因为它还没有被处理掉。

于 2012-09-18T10:08:20.960 回答
13

另一种解决方案

    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
    }
于 2014-02-12T10:22:17.877 回答
2

为什么不直接使用Disposed事件?

当表单关闭时,它会调用Dispose自身,并且所有子控件也将被递归处理。

于 2012-09-18T09:57:35.507 回答
1

试试这个:

UserControl.Dispose();
于 2012-09-18T10:41:55.493 回答