gpt4 book ai didi

C# 将代码添加到 FormClosing 事件会禁用 MdiParent 上的 X

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:20 24 4
gpt4 key购买 nike

我有两个后台线程和一个线程来处理在我的 WinForms 应用程序上运行的最小化。当程序关闭时,我使用这种方法。

private void MyForm_Closing(object sender, FormClosingEventArgs e)
{
if(labelsUpdaterThread.IsAlive == true)
labelsUpdaterThread.Abort();
if(printNotifyThread.IsAlive == true)
printNotifyThread.Abort();
if(minimizeThread.IsAlive == true)
minimizeThread.Abort();
}

labelsUpdaterThread 和 printNotifyThread 一直在运行。正如您可能猜到的那样,MinimizeThread 仅在父窗体最小化时运行。这是我的问题:

当在我上面的方法中调用 thread.abort 方法时,我的 MdiParent 窗体右上角的“X”没有做任何事情。单击它没有任何效果。

当在我上面的方法中没有调用 thread.abort 方法时,关闭 MdiParent 有时会抛出异常,因为线程仍在尝试访问 MdiParent 上不再可用的资源,即使它们是后台线程!

我不确定为什么会这样,对我来说没有多大意义。在此先感谢您的帮助!

最佳答案

我同意 Paul Alexander's answer因为你不应该永远调用Thread.Abort,这是处理同步的糟糕方式。

此外,这里的关注点分离很糟糕。线程不应直接访问表单中的资源。两者之间应该有某种抽象/共享状态,由双方(线程和表单)修改和读取,因此请确保实例线程安全。

就是说,如果您无法在 Close 方法中进行这些更改,则在另一个线程中调用 Thread.Abort 方法,每个方法都有一个 try/catch 语句。至少在某处记录错误。

在另一个线程上执行对 Thread.Abort 的调用时,您不会阻塞 UI 线程,因为不能保证对 Thread.Abort 的调用瞬时,阻塞 UI 线程将导致 X 变灰,同时 UI 线程无法处理 Windows 消息(这也有助于指导您更好地分离关注点)。

但是,您应该将表单和线程之间共享的资源抽象出来,并提供适当的取消机制。

如果您将资源抽象为一个共享状态的类,那么您的表单不必在关闭时执行任何操作,线程调用堆栈具有对具有该状态的对象的引用,然后您可以调用中止在这些线程上无需担心表单和线程共享任何内容。

然后,您可以从那里引入适当的合作取消机制( cooperative cancellation, which Task supports in .NET 4.0,如果您可以的话)。

关于C# 将代码添加到 FormClosing 事件会禁用 MdiParent 上的 X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4598484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com