繁体   English   中英

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

[英]GetStringAsync method call hangs the UI and never completes

我正在尝试使用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;
        }
    }

它挂在结果=等待client.GetStringAsync(url);

if(response.Result.UserInfo.UserId > 0){ -> .Result是一个阻塞调用,可能导致死锁。 在整个调用链中一直使用await。

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;
    }
}

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

并且,请阅读这篇出色的博客文章,了解有关如何创建此死锁的背景信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM