C# 使用await GetResponseAsync()时出现死锁

C# 使用await GetResponseAsync()时出现死锁,c#,json,wpf,asynchronous,C#,Json,Wpf,Asynchronous,我已经使用visual studio 2015中的控制台应用程序成功地将json数据拉入字符串。现在,我尝试将其复制到wpf中,但我发现我不能使用.GetResponse,而必须使用GetResponseAsync。在谷歌搜索了一段时间后,我想我理解了异步/等待的意义,但我似乎陷入了僵局。这是我目前的代码: 这是一个异步方法,它从web API提取返回数据并返回JSON字符串。或者在本例中是一项任务 我不知道为什么会这样,因为我用wait关键字等待请求?我还遗漏了什么?在这行中 string o

我已经使用visual studio 2015中的控制台应用程序成功地将json数据拉入字符串。现在,我尝试将其复制到wpf中,但我发现我不能使用.GetResponse,而必须使用GetResponseAsync。在谷歌搜索了一段时间后,我想我理解了异步/等待的意义,但我似乎陷入了僵局。这是我目前的代码:

这是一个异步方法,它从web API提取返回数据并返回JSON字符串。或者在本例中是一项任务

我不知道为什么会这样,因为我用wait关键字等待请求?我还遗漏了什么?

在这行中

string output = GetJson.Trola.GetTrola(station).Result;
您正在阻止UI线程。等待后的GetData部分需要在同一线程上运行。僵局

您应该使用wait来获得结果

string output = await GetJson.Trola.GetTrola(station);
您可以在这一行中找到关于的非常详细的说明。

string output = GetJson.Trola.GetTrola(station).Result;
您正在阻止UI线程。等待后的GetData部分需要在同一线程上运行。僵局

您应该使用wait来获得结果

string output = await GetJson.Trola.GetTrola(station);
您可以在上找到非常详细的解释。

我可以参考代码和存储库,例如,这正是您想要的

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);
}
例如,我可以引用代码和存储库,这正是您想要的

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

我试过了,但我猜我误读了这个错误。因为我在一个无效的按钮单击方法中调用了method.getTrola,所以我不能在其中使用wait操作符。因此,我应该编写一个新的异步方法,并在button_clicked方法中调用它,对吗?@mythic使事件处理程序async无效。然后你可以在里面用wait。通常异步方法应该返回一个任务,但是在事件处理程序中使用async void是可以接受的。因为我在一个无效的按钮单击方法中调用了method.getTrola,所以我不能在其中使用wait操作符。因此,我应该编写一个新的异步方法,并在button_clicked方法中调用它,对吗?@mythic使事件处理程序async无效。然后你可以在里面用wait。通常异步方法应该返回任务,但在事件处理程序中,可以使用async void。