Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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# 为什么应用程序.Exit无法工作?_C#_.net_Winforms - Fatal编程技术网

C# 为什么应用程序.Exit无法工作?

C# 为什么应用程序.Exit无法工作?,c#,.net,winforms,C#,.net,Winforms,我有一个应用程序在取消对话框时出现了奇怪的错误。如果框被取消,应用程序将无法继续,因此它将退出,但由于某些原因它无法工作,因此它将继续运行并崩溃 我调试了这个问题,但不知怎么的,应用程序运行时正好经过了application.Exit调用。我在调试模式下运行,这是相关的,因为有少量代码依赖于定义的发布变量。这是我的应用程序退出代码。我已经跟踪了代码,它进入了ExitApp方法,并继续运行,将控制权返回给调用方,最终崩溃 这是一个通过远程桌面连接提供报告的应用程序,因此退出代码有点奇怪。它试图终止

我有一个应用程序在取消对话框时出现了奇怪的错误。如果框被取消,应用程序将无法继续,因此它将退出,但由于某些原因它无法工作,因此它将继续运行并崩溃

我调试了这个问题,但不知怎么的,应用程序运行时正好经过了application.Exit调用。我在调试模式下运行,这是相关的,因为有少量代码依赖于定义的发布变量。这是我的应用程序退出代码。我已经跟踪了代码,它进入了ExitApp方法,并继续运行,将控制权返回给调用方,最终崩溃

这是一个通过远程桌面连接提供报告的应用程序,因此退出代码有点奇怪。它试图终止远程会话,但仅当在release下运行时,因为我不想在每次测试运行时关闭我的开发机器

    private void ExitApp()
    {
        HardTerminalExit();
        Application.Exit();
    }

    // When in Debug mode running on a development computer, this will not run to avoid shutting down the dev computer
    // When in release mode the Remote Connection or other computer this is run on will be shut down.
    [Conditional("RELEASE")]
    private void HardTerminalExit()
    {
        WTSLogoffSession(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, false);
    }
我已经运行了一个调试器,刚好经过了应用程序。退出行,什么也没有发生,然后在我跨过该行之后,控制返回给调用者

发生什么事了?这是一个Windows窗体应用程序。

此应用程序是否使用
application.run()
运行(在
Main
方法中)?否则,
Application.Exit()
将无法工作


如果您编写了自己的
Main
方法,并且希望停止应用程序,则只能通过从
Main
方法返回来停止(或终止进程)。

尝试
Environment.Exit(exitCode)
这篇文章扩展了您的思路:

基本上:

  • Exit-From MSDN:终止此进程并给出 底层操作系统 指定的退出代码。这是密码 在使用console时调用 应用程序

  • Application.Exit-从MSDN:通知所有消息泵 必须终止,然后关闭所有 消息后的应用程序窗口 已经处理过了。这是密码 如果您被呼叫,请使用 Application.Run(WinForms 应用程序),此方法停止所有 在所有线程上运行消息循环 并关闭所有窗口 应用还有一些 有关此方法的问题,请阅读 它在MSDN页面中显示

关于这一点的另一次讨论:

这篇文章指出了一个很好的提示:

通过检查System.Windows.Forms.Application.MessageLoop属性,可以确定是否调用了System.Windows.Forms.Application.Run。如果为true,则调用了Run,您可以假设WinForms应用程序正在执行,如下所示

if (System.Windows.Forms.Application.MessageLoop)
{
  // Use this since we are a WinForms app
  System.Windows.Forms.Application.Exit();
}
else
{
  // Use this since we are a console app
  System.Environment.Exit(1);
}

在很多情况下,我都使用Thread.CurrentThread.Abort()处理过这种情况


这个过程已经结束。似乎Application.Exit没有与当前线程正确连接。

还要确保应用程序中运行的所有线程的IsBackground属性都设置为true。非后台线程将很容易阻止应用程序退出

确保没有控制台。ReadLine();在应用程序和环境中。退出(1);将运行并关闭您的应用程序。

最近出现此问题(该应用程序.Exit无法正确终止带有Application.Run(new Form())的win forms的消息泵),我发现如果您在构造函数中生成新线程或启动后台工作程序,这将阻止Application.Exit运行

将所有“RunWorkerAsync”调用从构造函数移动到窗体加载方法:

public Form()
{
  this.Worker.RunWorkerAsync();
}
移至:

public void Form_Load(object sender, EventArgs e)
{
  this.Worker.RunWorkerAsync();
}
试试这个:

在Program.cs文件中:

应用程序之后运行(新表单())


添加应用程序。退出()

我创建了以下内容,可以在任何地方退出应用程序。您不必担心表单是否正在运行,测试将确定是否正在运行,并调用相应的退出

    public void exit(int exitCode)
    {
        if (System.Windows.Forms.Application.MessageLoop)
        {
            // Use this since we are a WinForms app
            System.Windows.Forms.Application.Exit()
        }
        else
        {
            // Use this since we are a console app
            System.Environment.Exit(exitCode);
        }
    } //* end exit()

我在调用exit方法之后添加了一个额外的返回。这就解决了问题。@TonyPeterson之所以需要这样做,是因为退出调用将退出消息放在队列上,但会继续执行,直到应用程序处理退出请求为止,因此您需要在此时返回到结束执行。哇,刚刚意识到这有多古老,sorryHi@TonyPeterson,你能把你添加的“额外退货”的代码贴出来吗?提前非常感谢。我将代码从仅显示表单更改为通过应用程序使用它。运行ReportDisplay rd=new ReportDisplay(u,cd.reports,u.root,email);应用程序运行(rd);控制台或
no forms
消息循环如何使用
Application.Run()
?我无法杀死beast,甚至无法使用方法
()=>ThreadExit()
…实现自己的ApplicationContext。对我来说,我执行了一个不同的form.Show()调用-关闭了该窗口,应用程序.exit()失败,我将其更改为form.ShowDialog()调用,一切都很好