我的一个应用程序可以防止窗口在运行时closures。
唯一的地方,我怀疑原因可能是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处理程序 – 简单的应用程序正确closures时,Windows开始closures。
还有什么可以防止窗户closures? 我应该在代码中debugging这个问题?
我的主窗体中没有自定义的WndProc实现。 这是一个.NET 2.0应用程序。
当我在debugging器中运行应用程序并启动关机时,我只得到“该程序阻止Windowsclosures”(Windows 7)一小会儿。 Windowsclosures了closures正在debugging的应用程序的debugging器的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; } }
请注意:当用户手动closures应用程序时,应用程序可以正常closures。
解决的问题:其中一个子窗体覆盖OnClosing
,使用以下代码:
protected override void OnClosing(CancelEventArgs e) { e.Cancel = true; this.Hide(); }
你有没有通过这个代码,看是否通过执行所有或者是否卡住某处? 可能锁由于某种原因无法获得同步锁定并等待。