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

为什么.NET应用程序会阻止Windows关闭?,.net,windows,debugging,shutdown,.net,Windows,Debugging,Shutdown,我的一个应用程序阻止windows在运行时关闭 我唯一怀疑原因可能是FormClosing事件处理程序,但这是非常标准的: 编辑:删除此处理程序不会改变任何情况,因此原因在其他地方 private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason != CloseReason.UserClosing) { StopAllThreads();

我的一个应用程序阻止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实现。这是一个.NET2.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;
    }
}

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

您是否仔细阅读了此代码,以查看它是否已全部执行完毕,或者是否在某个地方卡住了?锁可能由于某种原因无法获得syncLock并等待。

问题已解决:一个子窗体正在用以下代码重写关闭时的

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

StopAllThreads
的代码是什么样子的?我看到您正在使用线程(或者至少,我假设您正在使用);你可能有一些后台线程没有被关闭吗?当你删除这个函数时会发生什么?我看到你的评论“要求用户保存他的工作”。是否出现了一个阻止关机的模式窗口?@silky:我已经编辑了这个问题,为了解决这个问题,我添加了条件:if(e.CloseReason==CloseReason.UserClosing)e.Cancel=true;