代码之家  ›  专栏  ›  技术社区  ›  pankaj

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

  •  2
  • pankaj  · 技术社区  · 7 年前

    我试图使用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;
            }
        }
    

    它挂在绳子上 结果=等待客户端。GetStringAsync(url);

    1 回复  |  直到 7 年前
        1
  •  6
  •   Peter Bons    7 年前

    if(response.Result.UserInfo.UserId > 0){ ->。结果是 舞台调度 呼叫并可能导致死锁。在呼叫链上使用wait。

    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(...);

    请阅读 this 关于如何创建此死锁的优秀背景博客文章。

    推荐文章