首页 > 解决方案 > Async Task<> 函数的 Result 只是阻止程序运行

问题描述

所以,我试图从 Firebase 上的 User 表中获取我的数据,然后在我返回并尝试将结果设置为 Label 后,屏幕会变成全白(如果重要的话,我正在使用 xamarin for android)并且什么也没有发生。也许我做错了什么或者我错过了什么,我对任务的工作方式也有点模糊。我有人有任何想法,请随意给我任何指示或任何其他选择。这是我使用的代码。谢谢

UserDetailsRetrive.cs

public async Task<UserDetails> getUserInfoDetails()
        {
            FirebaseClient client = new FirebaseClient("https://xyz.firebaseio.com/");
            return (UserDetails)(await client.Child("user").OnceAsync<UserDetails>()).Select(item => new UserDetails
            {
                first_name = item.Object.first_name,
                last_name = item.Object.last_name,
                username = item.Object.username,
                birthdate = item.Object.birthdate,
                newsletter = item.Object.newsletter,
                term_condition = item.Object.term_condition
            });

配置文件.cs

 public void setUserInfo()
        {

            UserDetailsRetreive usr = new UserDetailsRetreive();
            UserDetails userDetails = usr.getUserInfoDetails().Result;
            username.Text = userDetails.username.ToString();


        }

用户详细信息.cs

class UserDetails
    {
        public string first_name { get; set; }
        public string last_name { get; set; }
        public string username { get; set; }
        public string birthdate { get; set; }
        public bool newsletter { get; set; }
        public bool term_condition { get; set; }


    }

标签: c#android.netfirebasexamarin

解决方案


Task.Result会阻塞直到Task完成,这就是您遇到 UI 冻结的原因。为了解决这个问题,您需要usr.getUserInfoDetails异步调用

public async Task setUserInfo()
{
    UserDetailsRetreive usr = new UserDetailsRetreive();
    UserDetails userDetails = await usr.getUserInfoDetails();
    username.Text = userDetails.username.ToString();
}

推荐阅读