使用await GetResponseAsync()时出现死锁

时间:2015-12-25 20:45:02

标签: c# json wpf asynchronous

我已经在visual studio 2015中使用控制台应用程序成功将json数据拉入字符串。现在我已经尝试将此复制到wpf,但我发现我不能使用.GetResponse()而且我有改为使用GetResponseAsync()。谷歌搜索了一段时间后,我想我理解async / await的观点,但我似乎陷入了僵局。所以这是我目前的代码:

这是从Web API提取返回数据并返回JSON字符串的异步方法。或者在这种情况下是Task<String>

public async static Task<String> GetTrola(string station)
        {
            var url = "http://www.trola.si/" + station;

            string text;

            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Accept = "application/json";

            var answer = (HttpWebResponse)(await request.GetResponseAsync());

            using (var sr = new StreamReader(answer.GetResponseStream()))
            {
                text = sr.ReadToEnd();
            }
            return text;
        }

然后我在按钮点击事件中调用该函数,如下所示:

string station = textBox.Text.ToString();
string output = GetJson.Trola.GetTrola(station).Result;
var myObject = JsonConvert.DeserializeObject<Result>(output);

但我认为问题出在GetData函数中,特别是这一行:

var answer = (HttpWebResponse)(await request.GetResponseAsync());

我不知道为什么会这样,因为我等待await关键字的请求?我还缺少别的东西吗?

2 个答案:

答案 0 :(得分:4)

在这一行

string output = GetJson.Trola.GetTrola(station).Result;

您正在阻止UI线程。与GetData之后的await部分需要运行的相同线程。死锁。

您应该使用await来获得结果

string output = await GetJson.Trola.GetTrola(station);

您可以在Stephen Cleary's blog找到非常详细的解释。

答案 1 :(得分:0)

我可以参考this代码和存储库,例如你想要的那样。

exec reindex 1, 2, 'new text'