Async with HTTPClient
本文关键字:HTTPClient with Async | 更新日期: 2023-09-27 17:49:14
我在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被执行时,它会阻塞应用程序并且永远不会返回。
我尝试了很多不同的代码,但我想我现在迷路了!!
在UI线程上调用Task<T>.Result
或Task.Wait
可能会导致死锁,我在我的博客中详细解释了这一点。
要解决这个问题,请将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
。 - 遵循基于任务的异步模式