我有以下代码
private void btnClose_Click(object sender, System.EventArgs e)
{
Close();
} // btnClose_Click
运行close winforms函数后,应用程序冻结。知道为什么会这样吗?
我使用.net 2.0,我在Windows 7 vs2005下运行
编辑:
在调试器中按下暂停后,我来到了
private void MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// GUI
if (FScannerThread_Running)
{
FScannerThread_Running = false;
FScannerThread.Join();
}
}
它堆积在FScannerThread.Join();
任何想法我怎么能杀死它?
答案 0 :(得分:5)
使用bool Thread.Join(int milliseconds)
重载,如果结果为false,则为Abort()
您的主题。
private void MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
// GUI
if (FScannerThread_Running)
{
FScannerThread_Running = false;
if (!FScannerThread.Join(1000)) // Give the thread 1 sec to stop
{
FScanner.Abort();
}
}
}
请注意,您应该在线程中捕获ThreadAbortException
以便优雅地结束它(例如,如果您要发布某些内容)。
答案 1 :(得分:4)
当它被冻结时,在调试菜单中调用暂停(全部中断) - 您将看到应用程序的不同线程可能挂起的位置。 这里的平台并不重要。有时,如果您有多线程应用程序,并且在某些线程中状态已损坏或类似情况,则可能发生这种情况。
答案 2 :(得分:2)
很可能是
FormClosing
或FormClosed
次活动在你的情况下,它们都是:)
理想情况下,如果可能,重写线程方法以正确考虑中止(例如,通过使用其中一个同步原语)。如果没有,您可以使用Abort
实例的Thread
方法,但这不是推荐方式。
答案 3 :(得分:1)
如果在关闭功能中,您只想退出应用程序,则可以将其替换为
Application.Exit();