我在WP8应用程序中使用HTTPClient调用WEB API。当我单击一个按钮时,我会查找用户凭据,如果可以,请转到主页面。 这是我的代码:
通话方式
private async void BtnLogin_OnClick(object sender, RoutedEventArgs e)
{
var user = new User();
if (user.IsAuthenticated(tbUserName.Text, tbPassword.Text))
{
NavigationService.Navigate(new Uri("/MainPage.xaml"));
}
}
用户类
public class User
{
private bool? _isAuthenticated;
public bool IsAuthenticated(string _userName, string _password)
{
return (bool) (_isAuthenticated ?? (_isAuthenticated = AuthenticateAsync(_userName, _password).Result));
}
private static async Task<bool> AuthenticateAsync(string userName, string password)
{
var baseUrl = string.Format(Constant.AuthenticateAPIUrl, userName, password);
try
{
var client = new HttpClient { BaseAddress = new Uri(baseUrl) };
var result = await client.PostAsync(baseUrl, new StringContent("")).ConfigureAwait(false);
result.EnsureSuccessStatusCode();
}
catch (HttpRequestException ex)
{
return false;
}
return true;
}
}
问题是当执行await时,它会阻止App并且永远不会返回。
我尝试了很多不同的代码,但我想我现在已经迷失了!!。
答案 0 :(得分:3)
Calling Task<T>.Result
or Task.Wait
on the UI thread can cause a deadlock我在博客中全面解释。
要解决此问题,请将Result
或Wait
的每次使用替换为await
public async Task<bool> IsAuthenticatedAsync(string _userName, string _password)
{
return (bool) (_isAuthenticated ?? (_isAuthenticated = await AuthenticateAsync(_userName, _password)));
}
private async void BtnLogin_OnClick(object sender, RoutedEventArgs e)
{
var user = new User();
if (await user.IsAuthenticatedAsync(tbUserName.Text, tbPassword.Text))
{
NavigationService.Navigate(new Uri("/MainPage.xaml"));
}
}
其他说明:
async void BtnLogin_OnClick
方法没有await
。