【问题标题】:`await HttpClient.GetAsync()` failing silently - DNX command line app [duplicate]`await HttpClient.GetAsync()` 静默失败 - DNX 命令行应用程序 [重复]
【发布时间】:2015-11-29 14:27:20
【问题描述】:

以下在指示的行上静默失败。

using (var ht = new HttpClient())
{
    var r = await ht.GetAsync(RootUrl + Id.ToString()); <-----
    Page = await r.Content.ReadAsStringAsync();
}

没有例外,没有错误,没有什么。执行只是停止,没有在下一行遇到断点,应用程序退出。包围在 try/catch 中也不会触发 catch。

作为 DNX .xproj 命令行应用运行。

coreclr 和 full 的行为相同。通过 VS 和 DNX 命令行启动。

这到底是怎么回事?

Project.json 如下:

{
    "version": "1.0.0-*",
    "description": "Scrapers Console Application",
    "authors": [ "Kaelan" ],
    "tags": [ "" ],
    "projectUrl": "",
    "licenseUrl": "",

    "dependencies": {

        "System.Net.Http": "4.0.0-*",
        "HtmlAgilityPack": "1.4.9"
    },

  "commands": {
    "Scrapers": "Scrapers"
  },

  "frameworks": {
    "dnx451": { }
    }
}

编辑:我正在使用的完整代码。拿了实际项目的一部分来测试,(保持同样的问题)。

public class Program
{
    const string RootUrl = "<-snipped->";
    public async void Main(string[] args)
    {
        var Id = 244;

        var Page = "";

        using (var ht = new HttpClient())
        {
            var r = await ht.GetAsync(RootUrl + Id.ToString());
            Debug.Write(r.StatusCode + " on page: " + Id.ToString());

            Page = await r.Content.ReadAsStringAsync();
        }

        Console.ReadLine();
    }
}

【问题讨论】:

  • 发布可执行的重现代码。
  • 不会添加很多,但请参阅编辑
  • 不应该有 async Main 的编译器警告吗?顺便说一句,回购确实指出了解决方案。查看答案。
  • 你会这么想的..
  • @usr:这不是一个普通的控制台 Main。这是一个 DNX 托管的控制台,带有一个实例(非静态)Main 方法,它实际上允许async Task Main 方法。所以编译器根本不把它当作特殊的(还)。我有一个blog post exploring this a bit

标签: c# asp.net-core


【解决方案1】:

你应该避免async void

对于没有结果值的方法,将返回类型更改为适当的异步返回类型:Task

【讨论】:

  • 很好的建议(也可能是一个很好的评论),但这篇文章以何种方式回答了这个问题?
  • @Eser:它会阻止 dnx 控制台应用程序退出,直到 HTTP 请求完成。因此,这是一个答案,而不是评论。
  • 我...实际上从未想过要检查。谢谢。
猜你喜欢
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2012-01-02
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多