为什么.NET应用程序会阻止Windows关闭?

时间:2010-08-24 08:32:17

标签: .net windows debugging shutdown

我的一个应用程序会阻止Windows在运行时关闭。

我怀疑原因的唯一地方可能是FormClosing事件处理程序,但这是非常标准的:

编辑:删除此处理程序根本不会改变这种情况,因此原因在其他地方。

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason != CloseReason.UserClosing)
    {
        StopAllThreads(); 
        //let close
        return;
    }
    //ask user whether he wants to save his work
}

我无法使用仅包含此FormClosing处理程序的最简单的应用程序重现这一点 - 当Windows开始关闭时,简单的应用程序正确关闭。

还有什么可以阻止Windows关闭?我应该在哪里查看代码来调试此问题?

我的主表单中没有自定义WndProc实现。这是一个.NET 2.0应用程序。

当我在调试器中运行应用程序并启动关机时,我只获得“此程序阻止Windows关闭”(Windows 7)一段时间。 Windows然后关闭Visual Studio,关闭调试器,关闭正在调试的应用程序。


编辑:StopAllThreads方法

public static void StopAllThreads()
{
    lock (syncLock)
    {
        foreach (IStop stoppable in stoppables)
        {
            try
            {
                stoppable.Stop(); //stops a running thread by setting a volatile boolean flag
            }
            catch (Exception ex)
            {
                Debug.Fail("Error stopping a stoppable instance: " + ex.ToString());
            }
        }
        stoppables.Clear();
        disposed = true;
    }
}

请注意:当用户手动关闭应用程序时,可以正常关闭应用程序。

2 个答案:

答案 0 :(得分:3)

问题解决了:其中一个子表单覆盖了OnClosing,代码如下:

    protected override void OnClosing(CancelEventArgs e)
    {
        e.Cancel = true;
        this.Hide();
    }

答案 1 :(得分:1)

你是否已经完成了这段代码,看看它是通过执行它还是在某个地方被卡住了?可能由于某种原因,锁无法锁定syncLock并等待。