程序退出/主窗体关闭时,表单未正确关闭。

7
在名为“Dev”的表单中,我有以下OnFormClosing函数,以确保当用户关闭表单时线程能够正确关闭。
protected override void OnFormClosing(FormClosingEventArgs e)
{
    base.OnFormClosing(e);
    dev.stopMultipleColorsWatcher();
}

如果我直接关闭“Dev”窗体,一切正常。但是如果“Dev”窗体关闭是因为主窗体(“Form1”)被关闭(导致程序退出),则“Dev”中的OnFormClosing()函数不会被调用,线程将继续运行,程序进程需要通过任务管理器杀死。

我该如何解决这个问题?我意识到我可以在“Form1”中添加一个OnFormClosing()函数,然后调用“Dev”中的OnFormClosing()函数,但我希望得到更简洁的解决方法。

更新:

从主窗体打开Dev窗体:

private void btn_opendev_Click(object sender, EventArgs e)
{
    Dev frm = new Dev();
    frm.Show();
}

主表单实际上被称为“programname.UI.Main”(是的,我知道..),并在“Program.cs”中打开(因此程序的入口点):
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new programname.UI.Main());
}

可能存在重复的问题https://dev59.com/13E95IYBdhLWcg3wMrAB。 - Bob.
1
你如何打开DEV表单?你的应用程序的主要表单是什么?哪个先启动? - Andriy Kizym
你尝试重写OnFormClosed了吗? - clearpath
@anderhil 我已经更新了问题并添加了那些信息。 - natli
@user676571 好的建议,但不幸的是它没有改变任何事情。 - natli
1个回答

4

代替

    Dev frm = new Dev();
    frm.Show();

试一试

    Dev frm = new Dev();
    frm.Show(this);

这个方法将一个所有者分配给子窗体,并且所有发送到主窗体的事件都会传递到子窗体。


@HansPassant,该表单并未在单独的线程上运行... 我只是想要一个线程在表单关闭时被关闭。想象一下,您有一个带有两个按钮的表单;一个用于启动执行无限循环操作的线程,另一个用于结束它。当用户关闭表单/程序时,您不想关闭该线程吗? - natli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接