为什么" RunAsync()。等待()"永远不会跑完,但如果我脱掉了"。等等()"它会给我正确的结果吗?

时间:2015-02-01 21:18:53

标签: c# wpf api

我有以下代码:

    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"))

这永远不会完成。但是,如果我从.Wait()取消RunAsync().Wait();,那么代码会正常运行到最后。当我将.Wait()放在方法调用上时,为什么会卡住?

我必须把它,因为如果我没有剩下的代码将继续运行,不会等待方法完成...

1 个答案:

答案 0 :(得分:4)

你在这里遇到了僵局。

等待之后的代码将在它启动的同一个线程中执行。这是等待的方式。但是,既然你已经通过调用 Wait()来阻止该线程,那么它将永远被锁定