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

标签 c# ios asynchronous xamarin xamarin.ios

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

最佳答案

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

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

关于c# - GetStringAsync 方法调用挂起 UI 并且永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48301962/

相关文章:

ios - self.navigationController 返回 nil (Swift)

android - 为 Actionbar SearchView 创建异步 ContentProvider

entity-framework - 异步 ObjectContext.SaveChanges()?

c# - 如何在 C# 中正确处理相关但不同类的调用方法

c# - EF 核心 : Define foreign key for part of a composite PK using a chained property

c# - 清除私有(private)收藏或将其设置为空?

multithreading - 如何使用协程懒惰地迭代一个大(大于内存)的 kotlin 序列

c# - 在 C# 中对单个文件使用 FileSystemWatcher

ios - 禁用 UIScrollView 惯性 (scrollViewDidEndDecelerating) Swift

ios - 如何从一个类调用另一个类的委托(delegate)方法