C# Winforms:Application.Exit vs Environment.Exit vs Form.Close

C# Winforms:Application.Exit vs Environment.Exit vs Form.Close,c#,.net,windows,vb.net,winforms,C#,.net,Windows,Vb.net,Winforms,以下是退出应用程序的方法: 环境。退出(0) Application.Exit() Form.Close() 这三种方法之间有什么区别以及何时使用每种方法?正确的方法是Application.Exit()。根据,它会终止所有消息循环并关闭所有窗口,从而使窗体能够执行其清理代码(在Form.OnClose等中) Environment.Exit只会终止进程。如果某个表单有未保存的更改,则不会有机会询问用户是否要保存这些更改。此外,资源(数据库连接等)无法正确释放,文件可能无法刷新等 Form.Cl

以下是退出应用程序的方法:

  • 环境。退出(0)
  • Application.Exit()
  • Form.Close()

  • 这三种方法之间有什么区别以及何时使用每种方法?

    正确的方法是
    Application.Exit()
    。根据,它会终止所有消息循环并关闭所有窗口,从而使窗体能够执行其清理代码(在Form.OnClose等中)

    Environment.Exit
    只会终止进程。如果某个表单有未保存的更改,则不会有机会询问用户是否要保存这些更改。此外,资源(数据库连接等)无法正确释放,文件可能无法刷新等

    Form.Close
    只做它所说的:它关闭一个表单。如果您打开了其他表单(可能不是现在,而是在应用程序的未来版本中),应用程序将不会终止

    请记住,如果使用多线程,
    Application.Exit()
    将不会终止线程(因此,即使GUI终止,应用程序仍将在后台工作)。因此,无论是在主函数中(即
    Program.main()
    ),还是在主窗体的
    OnClose
    事件中,都必须采取措施终止线程。

    它们都很好。 但是
    form.Close()
    不会关闭您的应用程序 它关闭窗体,然后 main方法返回一个int(exitcode)

    如果希望应用程序退出exitcodes,请使用
    Environmet.Exit(exitcode)
    或在main方法中返回exitcode

    Dim forceExitTimer = New Threading.Timer(Sub() End, Nothing, 2500, Timeout.Infinite)
    Application.Exit()
    

    此方法非常完美,允许软件使用application.exit轻轻关闭,然后调用强制关闭软件的野蛮End命令

    您可以在线程上设置IsBackground属性,这样它们就不会阻止进程终止。您所说的刷新文件真的是真的吗?当进程被终止时,操作系统应该关闭所有现有的句柄,这些句柄也会被刷新。@EsbenSkovPedersen但是可能有操作系统不知道的内部缓存(在应用程序、在.Net framework、在第三方库中等等)@Giorgi这在很大程度上取决于线程的设计,这是一个问题本身。通常,最好的方法是提供某种机制来“告诉”线程完成其工作。然后您可以
    Thread.Join()
    it,等待它真正完成,然后调用
    Application.Exit()
    。您也可以调用
    Thread.Abort()
    ,但这通常不是一个好选项,应谨慎使用。搜索像StackOverflow这样的问题,我想有很好的答案…这不是一个重复的问题。我不是问用哪一个退出应用程序。我只是想了解这些方法之间的区别,因为它们执行类似的操作。