我有一个父容器(窗体),该容器初始化了一个内部带有用户控件的新TabPage(从菜单栏调用)。选项卡控件具有一个上下文菜单,当您右键单击并选择“关闭选定的选项卡”时,我将调用一种删除该选项卡的方法。但是,它不会阻止该TabPage用户控件内的代码运行。我该如何清理,以便当我关闭Tab(TabPages.Remove ...等)时也关闭该TabPage中的用户控件,从而使任何后台代码停止执行?
下面的代码关闭了标签页: 删除标签后,后半部分只选择左侧的下一个标签。
public static void closeCurrentTab(TabControl tc)
{
int curTabIndex = tc.SelectedIndex;
TabPage tp = tc.SelectedTab;
tc.TabPages.Remove(tp);
if(curTabIndex > 0)
{
tc.SelectedTab = tc.TabPages[(curTabIndex - 1)];
}
}
答案 0 :(得分:0)
我发现了问题。我发现子处理控件中的异步进程甚至在处理父处理控件(在本例中为TabPage)之后也误入歧途。
下面是我如何解决的一个简单示例。
此外,对于更复杂的任务链,我可以在父级变为null时引入取消Tolkens,从而在用户关闭托管该控件的选项卡但不关闭整个应用程序时清除所有需要的内容。
使用this.Parent并测试它是否为null而不是喜欢的id。
protected override void OnParentChanged(EventArgs e)
{
base.OnParentChanged(e);
if(this.Parent == null)
{
// Clean up
}
}
和\或此
private async Task popUp()
{
do
{
MessageBox.Show("Im running!");
await Task.Delay(5000);
}
while (this.Parent != null);
}