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