使用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关键字等待请求?我还缺少什么?

使用await GetResponseAsync()时发生死锁

在行中

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);
}