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被执行时,它会阻塞应用程序并且永远不会返回。

我尝试了很多不同的代码,但我想我现在迷路了!!

Async with HTTPClient

在UI线程上调用Task<T>.ResultTask.Wait可能会导致死锁,我在我的博客中详细解释了这一点。

要解决这个问题,请将ResultWait的每次使用替换为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
  • 遵循基于任务的异步模式