【问题标题】:Intercepting application close in c#在 C# 中拦截应用程序关闭
【发布时间】:2009-05-05 03:50:58
【问题描述】:

我想正确地关闭一些套接字,并且能够告诉服务器我们正在关闭,但如果应用程序关闭,那么套接字都只是关闭,有时文件被锁定。我的应用程序关闭时如何运行方法?

这将进入一个将在表单应用程序中使用的库。

【问题讨论】:

标签: c# resource-cleanup


【解决方案1】:

如果它是一个 Windows 窗体应用程序,您可以将焦点放在窗体上,单击属性窗口中的事件闪电,然后使用窗体关闭事件。

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(OnFormClosing);

private void OnFormClosing(object sender, FormClosingEventArgs e)
{
    // Your socket logic here
}

此外,如果您需要拦截正在关闭的表单,请将 Cancel 属性设置为 true:

e.Cancel = true;

【讨论】:

    【解决方案2】:

    我会在使用这些资源的类上实现IDisposable。然后可以从应用程序类型支持的任何关闭方法(OnFormClose、OnStop、Application_End、...)显式调用 Dispose。

    【讨论】:

    • 垃圾收集器不会做这样的事情。终结器将调用您的类的终结器方法,该方法可能会调用 Dispose。
    • 谢谢塞缪尔,我已经进行了相应的编辑。尽管该链接确实显示了调用 Dispose 的析构函数,但这也不会释放托管资源(因为它是 Dispose(false))。但是,如果要创建一个公共方法来释放类的资源,那么我认为应该考虑实现 IDisposable。
    【解决方案3】:

    您是在谈论 WinForms 应用程序吗?如果是这样,请在主表单上使用FormClosing event

    【讨论】:

      【解决方案4】:

      我不确定这是否是它的最佳位置,但您可以通过挂钩 AppDomain.ProcessExit 来判断您的进程正在关闭。清理工作很好,但我认为现在不是发送任何消息的好时机。 :)

      【讨论】:

      • 那么如何发送消息呢?你需要帮助here
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多