【问题标题】:GetStringAsync method call hangs the UI and never completesGetStringAsync 方法调用挂起 UI 并且永远不会完成
【发布时间】:2018-06-26 09:13:34
【问题描述】:

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

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

【问题讨论】:

  • 如果你不能在你的代码库中一直使用异步/等待,那么使用同步 API 来防止阻塞。

标签: c# ios asynchronous xamarin xamarin.ios


【解决方案1】:

if(response.Result.UserInfo.UserId &gt; 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(...);

请阅读 this 优秀的博文,了解有关如何创建此死锁的背景。

【讨论】:

  • 我遇到了类似的问题,解决方法是“在调用链中一直使用 await。”
猜你喜欢
  • 2018-09-27
  • 2022-01-24
  • 1970-01-01
  • 2015-12-20
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多