Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';s Environment.Exit()和Application.Shutdown()之间的区别是什么?_C#_.net - Fatal编程技术网

C# 什么';s Environment.Exit()和Application.Shutdown()之间的区别是什么?

C# 什么';s Environment.Exit()和Application.Shutdown()之间的区别是什么?,c#,.net,C#,.net,有时我调用时应用程序无法退出,UI已关闭,但进程仍在运行。如何关闭应用程序并关闭所有线程?()是否可以关闭所有线程?或者我们应该调用Win32 API TerminateThread来执行此操作?是关闭应用程序的一种更残酷的方式,是的。但总的来说,如果你需要关闭你的应用程序来关闭它,那么我认为你在错误地看待这个问题。 您应该更深入地了解其他线程没有正常关闭的原因 您可以查看主窗体上的,并关闭挂起应用程序的任何资源,以防止其关闭 这就是我如何找到挂起应用程序的资源 在调试模式下,启用的显示。(这将

有时我调用时应用程序无法退出,UI已关闭,但进程仍在运行。如何关闭应用程序并关闭所有线程?()是否可以关闭所有线程?或者我们应该调用Win32 API TerminateThread来执行此操作?

是关闭应用程序的一种更残酷的方式,是的。但总的来说,如果你需要关闭你的应用程序来关闭它,那么我认为你在错误地看待这个问题。 您应该更深入地了解其他线程没有正常关闭的原因

您可以查看主窗体上的,并关闭挂起应用程序的任何资源,以防止其关闭

这就是我如何找到挂起应用程序的资源

  • 在调试模式下,启用的显示。(这将允许您查看应用程序正在运行的所有线程。)
  • 以无法正确关闭的方式关闭应用程序
  • 在VisualStudio中按暂停
  • 查看线程列表,并单击它们以查看它们挂起的代码的位置。现在您可以看到哪些资源阻止您的应用程序关闭,请转到FormClosing事件并在那里关闭/处置它们
  • 重复此操作,直到应用程序正确关闭:)
  • 请注意,调试模式下的线程列表将显示一些正在运行但不受您控制的线程。这些线程很少有名称,当你点击它们时,你会收到一条消息说你没有符号。可以放心地忽略这些

    确保应用程序正常关闭的原因之一是某些资源(比如a)没有正常工作,因此使用某些API强制退出可能会导致各种“随机”问题,例如设置/数据文件没有写入等等

  • 确保生成的所有线程都标记为后台线程,这样在关闭应用程序时就不会等待它们完成

  • 正如Shay所说,永远不要调用TerminateThread,TerminateThread只杀死一个线程,而不让它自己清理。这可能会导致进程中其他线程的死锁和损坏

    另一个had上的TerminateProcess将杀死整个进程并让操作系统进行清理,这是关闭进程的最快方法-您只需确保没有任何操作系统无法清理的资源(在调用TerminateProcess之前关闭windows也有帮助)

    我想,但我还没有检查,那个环境。退出调用TerminateProcess


    应用程序。关机非常不同,它不会立即终止进程-它会发送所有关闭和关机通知,并等待所有应用程序的窗口和线程自行关闭。

    哦,太棒了。我不知道你能帮我解决这个问题。非常有用,令人惊讶的是它没有被更广泛地了解。哲学问题(或者可能是一个愚蠢的问题):如果我们永远不应该调用它,为什么它会存在?@alzaimar:函数存在是因为有非常非常有限的情况下,人们可能被迫调用它。有关限制性案例的详细信息,请参见。我补充说,如果代码写得更好,甚至这些情况也可以避免。所以,这仍然存在的原因可能是:历史和兼容性。感谢您的响应,称为“Application.Shutdown”,但进程仍在运行并不总是发生的,我尝试了您的方法来找出哪个线程正在运行,但此错误没有重新产生。。。