首页 > 解决方案 > 使用方法返回布尔值的异步任务

问题描述

我有一个异步任务,我用它来调用一个方法,然后将返回一个布尔值。

   public async Task LoginAsync(){

            await Task.Run(() =>
            {
                CheckUsernameLogin();
            });
        }

在发生这种情况时,我也在其他地方更新 GUI。我想使用 LoginAsync() 将值分配给布尔值 ie bool x = LoginAysnc();。我试过让异步方法看起来像这样

   public async Task<bool> LoginAsync(){

            return await Task.Run(() =>
            {
                CheckUsernameLogin();
            });
        }

然后尝试用这样的东西分配返回值,bool x = LoginAsync.Result;但这会使我的应用程序死锁。我这样做是为了检查用户名登录凭据(由 CheckUsernameLogin 确定)是否有效,同时还更新 GUI 以保存进度条。我想使用返回的布尔值根据凭据的有效性创建 AlertDialogs。我非常沮丧和卡住。提前致谢。

编辑!

这是另一种方法。一些用户建议使 CheckUsernameLogin 异步,但我不知道我会在哪里,但等待调用。我也知道我的 AlertDialogs 将不起作用,因为我以异步方式或类似方式使用此方法。我对等待/同步的东西很陌生。多谢你们。

 public async Task<bool> CheckUsernameLogin(){
        MySqlConnection connection = new MySqlConnection("Top Secret Server Stuff");
        connection.Open();
        username = FindViewById <TextView>(Resource.Id.username_field).Text;
        TriTrack.Utils.Settings.LastUsername = FindViewById<TextView>(Resource.Id.username_field).Text;
        password = FindViewById<TextView>(Resource.Id.password_field).Text;
        TriTrack.Utils.Settings.LastPassword = FindViewById<TextView>(Resource.Id.password_field).Text;
        string user_password;
        List<string> names = new List<string>();
        var command = connection.CreateCommand();
        command.CommandText = ("SELECT username FROM users where username=@username;");
        command.Parameters.AddWithValue("@username", username);
        MySqlDataReader username_reader = command.ExecuteReader();
        while (username_reader.Read())
        {
            names.Add(username_reader.GetString("username"));
        }
        username_reader.Close();
        if (names.Count != 1){
            ShowAlert();
            return false;
        }
        else{
            command.CommandText = ("SELECT password FROM users where username=@username;");
            command.Parameters.AddWithValue("@username", username);
            MySqlDataReader password_reader = command.ExecuteReader();
            password_reader.Read();
            user_password = password_reader.GetString(0);
            if(user_password == password){
                Intent intent = new Intent(this, typeof(MapsActivity));
                this.StartActivity(intent);
                return true;
            }
            else{
                ShowAlert();
            }
        }
        return false;
    }

标签: c#androidasynchronousxamarinasync-await

解决方案


按照以下步骤实现您的结果:

  1. 启动动画以显示进度。旋转齿轮(我个人的偏好)比进度条更好。例如ShowRotatingCog();

  2. 使用异步触发您的登录用户bool x = await CheckUsernameLogin();

  3. 隐藏 cog 后显示异步操作的结果。例如 HideRotatingCog(); if(x) Alert("Login Successful"); else Alert("Invalid Login");


推荐阅读