HttpClient.PostAsync导致应用程序退出,退出代码为0。

38
今天一切正常,直到突然停止...以下是最少的源代码(我使用VS 2012更新1,.Net 4.5)。运行时,当调用client.PostAsync()时,应用程序退出,因此它永远不会达到Console.ReadLine()。在调试器中也是一样,没有异常,什么也没有,退出代码为0。
我尝试重新启动计算机,重新启动VS2012-无效。
再次强调,今天一切都正常运行,不确定发生了什么改变(没有安装任何软件等,所有其他网络应用程序仍在工作)。
有什么想法吗?我觉得我快疯了。
class Program
{
    static void Main(string[] args)
    {
        Run();
    }

    private async static void Run()
    {
        using (var client = new System.Net.Http.HttpClient())
        {
            var headers = new List<KeyValuePair<string, string>>
                              {
                                  new KeyValuePair<string, string>("submit.x", "48"),
                                  new KeyValuePair<string, string>("submit.y", "15"),
                                  new KeyValuePair<string, string>("submit", "login")
                              };

            var content = new FormUrlEncodedContent(headers);

            HttpResponseMessage response = await client.PostAsync("http://www.google.com/", content);

            Console.ReadLine();
        }
    }
}
1个回答

73
您的问题在于,程序通常在其Main()方法完成时退出。而您的Main()方法在您在Run()中输入await后立即完成,因为这就是async方法的工作方式。
您应该将Run()变成一个async Task方法,然后在您的Main()方法中等待Task
static void Main()
{
    RunAsync().Wait();
}

private static async Task RunAsync()
{}

在C# 7.1+中,您应该使用async Main代替:
static async Task Main()
{
    await RunAsync();
}

private static async Task RunAsync()
{}

需要注意以下几点:

  1. 除非必须使用(如异步事件处理程序),否则不应使用async void方法。
  2. 在GUI应用程序或ASP.NET中混合使用awaitWait()是危险的,因为会导致死锁。但如果您想在控制台应用程序中使用async,这是正确的解决方案。

8
作为一条提示,将顶层的try/catch放在RunAsync而不是Main中会更容易,因为Task.Wait会用AggregateException包装异常。请注意保持翻译内容的原意和简洁性,不要添加解释或其他额外信息。 - Stephen Cleary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接