代码之家  ›  专栏  ›  技术社区  ›  Marek

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

  •  3
  • Marek  · 技术社区  · 14 年前

    我的一个应用程序阻止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关机”(Windows7)。然后,Windows关闭Visual Studio,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 回复  |  直到 5 年前
        1
  •  3
  •   Marek    14 年前

    问题已解决:其中一个子窗体正在重写 OnClosing ,代码如下:

        protected override void OnClosing(CancelEventArgs e)
        {
            e.Cancel = true;
            this.Hide();
        }
    
        2
  •  1
  •   Matt_JD    14 年前

    您是否已经逐步通过了这段代码来查看它是通过执行它来完成的,还是停留在某个地方?可能由于某种原因,锁无法获取SyncLock并等待。