我有一个 UserControl 派生控件,用于显示从 Web 服务器获取的一些信息。我目前正在使控件的初始化异步,以提高响应能力。
在我的 Load 事件处理程序中,我正在创建一个 CancellationTokenSource,并在各种异步调用中使用关联的令牌。
我现在想确保如果用户在异步操作完成之前关闭表单,则该操作将被取消。换句话说,我想对令牌调用取消。
我正在尝试找出在哪里执行此操作。如果有一个我可以捕获的 Unload 事件,那就完美了 - 但没有。事实上,我找不到任何看起来合适的活动。
我可以捕获包含表单的关闭事件,但我真的想将所有内容保留在我的用户控件本地。
建议?
我建议使用 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
}
试试这个:
UserControl.Dispose();
尝试 UserControl_VisibleChange 事件,例如在加载 UserControl 期间是否启用了任何服务(例如启用的计时器)或打开任何端口(例如 com1),只需检查该服务是否已启用,然后运行您所需的代码,这将指示此表单正在关闭。