为什么 "RunAsync().Wait()" 永远不会完成 运行,但如果我取消“.Wait()”,它 returns 我会得到正确的结果?
Why does "RunAsync().Wait()" never finishes running, but if i take off the ".Wait()" it returns me the right result?
我有以下代码:
public MainWindow()
{
InitializeComponent();
RunAsync().Wait();
}
private static async Task RunAsync()
{
var baseAddress = new Uri("https://api.trakt.tv/");
using (var httpClient = new HttpClient { BaseAddress = baseAddress })
{
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("trakt-api-version", "2");
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("trakt-api-key", "");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
using (var response = await httpClient.GetAsync("search?query=Arrow&type=Show"))
{
string responseData = await response.Content.ReadAsStringAsync();
}
}
}
当我运行它时,它卡在了以下部分:
using (var response = await httpClient.GetAsync("search?query=Arrow&type=Show"))
这永远不会完成 运行ning。但是如果我从 RunAsync().Wait();
中取下 .Wait()
那么代码 运行 就会正常结束。为什么我把 .Wait()
放在方法调用上时会卡住?
我必须说出来,因为如果我不这样做,其余代码将继续 运行 并且不会等待方法完成...
你这里遇到了僵局。
await 之后的代码将在启动时在同一个线程中执行。这就是 await 的工作方式。但是由于您已经通过调用 Wait() 阻塞了线程,它将永远被锁定
我有以下代码:
public MainWindow()
{
InitializeComponent();
RunAsync().Wait();
}
private static async Task RunAsync()
{
var baseAddress = new Uri("https://api.trakt.tv/");
using (var httpClient = new HttpClient { BaseAddress = baseAddress })
{
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("trakt-api-version", "2");
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("trakt-api-key", "");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
using (var response = await httpClient.GetAsync("search?query=Arrow&type=Show"))
{
string responseData = await response.Content.ReadAsStringAsync();
}
}
}
当我运行它时,它卡在了以下部分:
using (var response = await httpClient.GetAsync("search?query=Arrow&type=Show"))
这永远不会完成 运行ning。但是如果我从 RunAsync().Wait();
中取下 .Wait()
那么代码 运行 就会正常结束。为什么我把 .Wait()
放在方法调用上时会卡住?
我必须说出来,因为如果我不这样做,其余代码将继续 运行 并且不会等待方法完成...
你这里遇到了僵局。
await 之后的代码将在启动时在同一个线程中执行。这就是 await 的工作方式。但是由于您已经通过调用 Wait() 阻塞了线程,它将永远被锁定