【问题标题】:what is the cause for my console app exiting with code 0?我的控制台应用程序以代码 0 退出的原因是什么?
【发布时间】:2020-03-06 17:48:22
【问题描述】:

我正在尝试通过其 url 调用站点以构建 webscraper,但是当我尝试从等待的 url 中获取项目时,我的应用程序停止并显示以下消息:

blablah.exe (process 1512) exited with code 0.
To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stop

我不认为这是代码问题,也许是我的 Visual Studio 调试器的问题?我一辈子都看不到它是什么。

这是一个 .net 核心命令行应用程序

一些代码以防万一

    static void Main(string[] args)
    {
        GetHtmlAsync();

    }

    private static async void GetHtmlAsync()
    {
        var url = "https://blahblah.com";

        var client = new HttpClient();
        var html = await client.GetStringAsync(url);

        var htmlDoc = new HtmlDocument();
        htmlDoc.LoadHtml(html);


        var newsList = htmlDoc.DocumentNode.Descendants("table")
            .Where(node => node.GetAttributeValue("class","")
            .Equals("itemList")).ToList();


        Console.WriteLine(newsList);


        Console.Read();


    }
}

调试时它甚至永远达不到:

var htmlDoc = new HtmlDocument();

有什么想法吗?

【问题讨论】:

  • 最可能的原因是未处理的异常。添加调试代码,例如带有错误记录的 try/catch。您还可以查看系统事件日志,通常情况下也会记录异常,但这取决于系统和配置的设置。
  • 您在 Main 中启动了一个异步函数,然后退出了您的程序。这就像把蛋糕放在烤箱里,然后在蛋糕烤好之前立即卖掉烤箱。
  • 0 是正常退出。您无需等待GetHtmlAsync,因此应用程序在该方法有机会完成之前正常退出。
  • @Wyck 我的星期五晚上笑了,很好的比喻。

标签: c# .net-core command-line


【解决方案1】:

这里有几个问题

1) 当您调用GetHtmlAsync() 时,您并没有在等待它,这意味着您的应用程序会继续运行它之后的代码(其中没有),从而导致应用程序退出

2) 你应该avoidasync void 除了事件处理程序,而是返回async Task

修改后的代码可能如下所示

static async Task Main(string[] args)
{
    await GetHtmlAsync();
}

private static async Task GetHtmlAsync()
{
  //Do stuff
}

请注意,要使用 async Task Main,您至少需要使用 C# 7.1

【讨论】:

  • 哦,是的,我不应该为流感编码,所以很尴尬让这个溜走!
  • 发生在我们最好的人身上
【解决方案2】:

它返回 0(零),成功的原因是它没有错误地退出。

将方法改为:

private static async Task GetHtmlAsync()

然后这样称呼它:

GetHtmlAsync().Wait();

该方法将同步运行,但应用程序仍然按照所写的那样运行。

【讨论】:

  • C# 允许async Task Main
  • @PanagiotisKanavos 这取决于版本。
  • 确切地说是C# 7.1,async Task Main 也只是编译为GetHtmlAsync().GetAwaiter().GetResult() 的语法糖,如果我正在阅读Async main method docs correctly。在我看来,如果你在一个受监管/受控的环境中工作,因为运维团队不会/不会主动将责任转嫁给开发人员,因此构建服务器经常会运行过时的软件,那么你就不得不跳过这些工作。用于简单的 C# 或 .NET 升级。
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 2013-04-19
  • 2016-08-29
  • 1970-01-01
  • 2016-12-08
  • 2020-01-30
  • 2012-05-04
相关资源
最近更新 更多