使用await GetResponseAsync()时发生死锁
本文关键字:死锁 await GetResponseAsync 使用 | 更新日期: 2023-09-27 18:28:00
我已经在visualstudio2015中使用控制台应用程序成功地将json数据拉入字符串。现在我试着为wpf复制这个,但我发现我不能使用.GetResponse(),我不得不使用GetResponseAsync()。在谷歌上搜索了一段时间后,我想我明白了async/await的意义,但我似乎陷入了僵局。这是我目前的代码:
这是一个异步方法,从web API获取返回数据并返回JSON字符串。或者在这种情况下是CCD_ 1。
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
关键字等待请求?我还缺少什么?
在行中
string output = GetJson.Trola.GetTrola(station).Result;
您正在阻塞UI线程。await
之后的GetData
部分需要在相同的线程上运行。死锁。
您应该使用await
来获得结果
string output = await GetJson.Trola.GetTrola(station);
你可以在Stephen Cleary的博客上找到一个非常详细的解释。
例如,我可以引用您想要的代码和存储库。
public async Task<TranslateResult> Find(TranslateRequest translateRequest)
{
if (!configuration.IsAppropriateForTranslation(TranslatorType))
return new TranslateResult(false, new Maybe<string>());
var address = configuration.TurengUrl;
var uri = new Uri(address + translateRequest.CurrentText);
var turenClient = new WebClient();
turenClient.Encoding = Encoding.UTF8;
turenClient.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36");
turenClient.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8,tr;q=0.6");
turenClient.CachePolicy = new HttpRequestCachePolicy(HttpCacheAgeControl.MaxAge, TimeSpan.FromHours(1));
var compositeMean = await turenClient.DownloadStringTaskAsync(uri);
var organizer = meanOrganizerFactory.GetMeanOrganizers().First(x => x.TranslatorType == TranslatorType.TURENG);
var mean = await organizer.OrganizeMean(compositeMean);
return new TranslateResult(true, mean);
}