HttpClient.PostAsync用退出代码0敲出应用程序

时间:2013-01-06 06:41:02

标签: c# visual-studio-2012 httpclient .net-4.5 async-await

今天一切正常,直到停止......以下是最小的源代码(我使用的是VS 2012 Update 1 .Net 4.5)。当我运行它时,app会在调用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 个答案:

答案 0 :(得分:35)

您的问题是程序通常在其Main()方法完成时退出。一旦您点击Main()中的await,您的Run()就会完成,因为这就是async方法的工作方式。

您应该做的是将Run()变为async Task方法,然后等待Task方法中的Main()

static void Main()
{
    RunAsync().Wait();
}

private static async Task RunAsync()
{
    …
}

几点注释:

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