【问题标题】:Try/Catch, Windows Service and Environment.ExitTry/Catch、Windows 服务和 Environment.Exit
【发布时间】:2015-03-01 16:33:03
【问题描述】:

我在 Windows Azure Server 2012 R2 VM 上的 Windows 服务应用程序中发现了非常有趣的行为。我的 windows 服务调用,

ThreadPool.QueueUserWorkItem((_) => DoWork());

在 DoWork 中,

    private static void DoWork()
    {
        try
        {
            // Do all work
            Environment.Exit(0);
        }
        catch (Exception ex)
        {
            Logger.Log(ex);
        }
    }

Environment.Exit(0) 的调用导致进程崩溃。没有登录事件查看器,也没有更多信息。只是process unexpectedly terminated。为什么 try/catch 在那里不起作用?这是 Windows 服务应用程序的预期行为吗?

【问题讨论】:

  • 你不应该从这样的线程中关闭你的应用程序......

标签: c# azure windows-services windows-server-2012-r2


【解决方案1】:

为什么 try/catch 在那里不起作用?

根据MSDN

如果 Exit 从 try 或 finally 块中调用,则任何 catch 中的代码 块不执行。

@RufusL 说你不应该那样关闭你的应用是对的。

也许有一种更优雅的方式来关闭您的应用。 就像,也许,调用一个结束事件,或者你可以尝试删除 Environment.Exit(0) 代码并“让事情发生”:D

【讨论】:

  • 我不这样做。只是问为什么我的进程崩溃而不是关闭应用程序,因为 MSDN 说它将关闭应用程序。如果它抛出错误,则应该调用 catch。
  • @user960567 请阅读我的回答。如果从 try 或 finally 块调用 Exit,任何 catch 块中的代码都不会执行。 没有办法改变它。除非你要去微软并告诉他们改变他们的 API 工作方式。通常情况正好相反:开发人员适应微软提供的功能使用不同的功能或解决方法。你不能强迫微软只为你改变他们的功能。
  • MSDN 链接从来没有说如果发生异常呢?
  • @user960567 我听不懂你的句子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2010-12-14
  • 2014-11-27
  • 2013-06-17
  • 2011-02-20
  • 1970-01-01
相关资源
最近更新 更多