当我尝试关闭它时,Winform冻结

时间:2011-01-25 15:14:59

标签: c# .net winforms

我有以下代码

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();任何想法我怎么能杀死它?

4 个答案:

答案 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)

很可能是

  1. 你做过的任何一件事 FormClosingFormClosed次活动
  2. 另一个仍在运行的主题
  3. 在你的情况下,它们都是:)

    理想情况下,如果可能,重写线程方法以正确考虑中止(例如,通过使用其中一个同步原语)。如果没有,您可以使用Abort实例的Thread方法,但这不是推荐方式。

答案 3 :(得分:1)

如果在关闭功能中,您只想退出应用程序,则可以将其替换为

Application.Exit();