我已经在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
关键字的请求?我还缺少别的东西吗?
答案 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'