今天一切正常,直到它停止…下面是最小的源代码(我使用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();
}
}
}
您的问题是程序通常在其Main()
方法完成时退出。当你在Run()
中碰到await
时,你的Main()
就结束了,因为这就是async
方法的工作方式。
你应该做的是使Run()
成为async Task
方法,然后等待Task
在你的Main()
方法:
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()
{
…
}
注释:
- 你不应该使用
- 在GUI应用程序或ASP中混合
await
和Wait()
。NET是危险的,因为它会导致死锁。但如果你想在控制台应用程序中使用async
,这是正确的解决方案。
async void
方法,除非你必须使用(这是异步事件处理程序的情况)。