GetStringAsync方法调用挂起UI并且永远不会完成

pan*_*kaj 2 c# asynchronous xamarin.ios ios xamarin

我试图使用GetStringAsync方法访问我的URL,但调用挂起并永远不会结束.当我在浏览器中检查它时它工作得很完美但不知何故在我的代码中它永远不会结束.我的代码:

public bool Login(string url,string userName, string password)
    {
        try
        {
            Task<LoginResponse> response = GetLoginData(url, userName, password);
            if(response.Result.UserInfo.UserId > 0){
                IsAuthenticated = true;
            }
            return IsAuthenticated;
        }
        catch (ArgumentException argex)
        {
            ErrorMessage = argex.Message;
            IsAuthenticated = false;
            return IsAuthenticated;
        }
    }

    public async Task<LoginResponse> GetLoginData(string url, string userName, string password)
    {
        try{
            var param = new AuthenticationParam();
            param.UserName = userName;
            param.Password = password;

            var response = await LoginValidate(url, param);

            response = response.Replace("\"", string.Empty);
            response = response.Replace("\\", "\"");

            LoginResponse list = JsonConvert.DeserializeObject<LoginResponse>(
                response, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

            return list;
        }
        catch(Exception e){
            System.Diagnostics.Debug.WriteLine(e);
            return new LoginResponse();
        }
    }

    private static async Task<string> LoginValidate(string url, AuthenticationParam param){
        try
        {
            string result = "";
            using (var client = new HttpClient())
            {
                var json_data = string.Empty;
                json_data = JsonConvert.SerializeObject(param);
                var byteArray = Encoding.UTF8.GetBytes(json_data);
                var base64 = Convert.ToBase64String(byteArray);
                url = $"{url}{base64}";
                result = await client.GetStringAsync(url);
                return result;
            }
        }
        catch (Exception ex)
        {
            return "Error: " + ex.Message;
        }
    }
Run Code Online (Sandbox Code Playgroud)

它挂起在行result = await client.GetStringAsync(url);

Pet*_*ons 5

if(response.Result.UserInfo.UserId > 0){- > .Result是一个阻塞调用,可能导致死锁.使用等待调用链的所有方式.

public async Task<bool> Login(string url,string userName, string password)
{
    try
    {
        var response = await GetLoginData(url, userName, password);
        if(response.UserInfo.UserId > 0){
            IsAuthenticated = true;
        }
        return IsAuthenticated;
    }
    catch (ArgumentException argex)
    {
        ErrorMessage = argex.Message;
        IsAuthenticated = false;
        return IsAuthenticated;
    }
}
Run Code Online (Sandbox Code Playgroud)

在调用堆栈中使用 var success = await Login(...);

请阅读这篇优秀的博客文章,了解如何创建此死锁.