29

今天一切正常,直到它停止...以下是最低源代码(我使用的是 VS 2012 Update 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();
        }
    }
}
4

1 回答 1

58

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

你应该做的是制作Run()一个方法,然后在你的方法中async Task等待:TaskMain()

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. await在 GUI 应用程序或ASP.NET 中混合Wait()使用是危险的,因为它会导致死锁。但如果您想async在控制台应用程序中使用,这是正确的解决方案。
于 2013-01-06T14:28:27.423 回答