Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在控制台应用程序-死锁中调用HttpClient.GetAsync_C#_.net_Async Await_Dotnet Httpclient - Fatal编程技术网

C# 在控制台应用程序-死锁中调用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.

我搜索并看到了很多帖子,我不知道为什么这个使用httpclient.getasync的简单控制台调用并等待它会导致它无法完成。代码如下:

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,我不想这样做。这个应用程序不应该死锁(我甚至尝试过它——对我来说不是)。这似乎已经成功了,我想我也看到了另一个线程的建议,但当我应用它时,由于某种原因它不起作用。我必须回去,确保没有其他的“同步”电话阻止它工作。