C# 在控制台应用程序-死锁中调用HttpClient.GetAsync
我搜索并看到了很多帖子,我不知道为什么这个使用httpclient.getasync的简单控制台调用并等待它会导致它无法完成。代码如下:C# 在控制台应用程序-死锁中调用HttpClient.GetAsync,c#,.net,async-await,dotnet-httpclient,C#,.net,Async Await,Dotnet Httpclient,我搜索并看到了很多帖子,我不知道为什么这个使用httpclient.getasync的简单控制台调用并等待它会导致它无法完成。代码如下: using System; using System.Net.Http; using System.Threading.Tasks; public class Program { public static void Main(string[] args) { GetAPI().Wait(); Console.
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
GetAPI().Wait();
Console.WriteLine("Hello");
//Console.ReadLine();
}
public static async Task GetAPI()
{
using (HttpClient client = new HttpClient())
{
var response = await client.GetAsync("https://www.google.com/");
//var response = client.GetAsync("https://www.google.com/").Result
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
}
}
如果我改为使用client.GetAsync(“”).Result;并删除“await”(请参阅注释掉的代码),它将工作,但我认为这是一个禁忌,因为我正在将异步函数转换为同步函数。我看过其他关于这一点的帖子和博客,它们都声称我试图做的是正确的,但当运行示例应用程序时,结果却不是这样。问题是等待client.GetAsync,在得到结果后,等待主线程释放,而主线程等待client.GetAsync完成
var response = await client.GetAsync("https://www.google.com/").ConfigureAwait(false);
string content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
将告诉client.GetAsync在其他线程上完成,然后将结果返回主线程,以便不再出现死锁。您可以在main
中调用wait()
但是要小心,这只适用于控制台应用程序
,并且会在诸如ASP.NET、WPF、WinForms等UI应用程序中死锁
public void Main(string[] args)
{
try
{
var t = GetAPI();
t.Wait();
Console.WriteLine(t.Result);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public static async Task<string> GetAPI()
{
using (HttpClient client = new HttpClient())
{
var response = await client.GetAsync("https://www.google.com/");
string content = await response.Content.ReadAsStringAsync();
return content;
}
}
public void Main(字符串[]args)
{
尝试
{
var t=GetAPI();
t、 等待();
控制台写入线(t.Result);
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
公共静态异步任务GetAPI()
{
使用(HttpClient=new HttpClient())
{
var response=wait client.GetAsync(“https://www.google.com/");
string content=wait response.content.ReadAsStringAsync();
返回内容;
}
}
这段代码在控制台应用程序中可以正常工作,但是
从GUI或ASP.NET上下文调用时发生死锁
和的可能重复,这可能是一个死锁问题,但我试图通过不调用来避免它。导致GetAPI调用。我正在尝试使用async和Wait来防止死锁。我只在console程序的主函数中使用了wait(),它需要阻止程序退出。你链接的其他线程都在调用Result,我不想这样做。这个应用程序不应该死锁(我甚至尝试过它——对我来说不是)。这似乎已经成功了,我想我也看到了另一个线程的建议,但当我应用它时,由于某种原因它不起作用。我必须回去,确保没有其他的“同步”电话阻止它工作。