与HTTPClient异步

时间:2014-03-10 16:04:33

标签: c# asynchronous windows-phone-8 async-await

我在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并且永远不会返回。

我尝试了很多不同的代码,但我想我现在已经迷失了!!。

1 个答案:

答案 0 :(得分:3)

Calling Task<T>.Result or Task.Wait on the UI thread can cause a deadlock我在博客中全面解释。

要解决此问题,请将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"));
    }
}

其他说明: