Async Task使用方法[duplicate]返回布尔值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Async Task使用方法[duplicate]返回布尔值相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我有一个异步任务,我用来调用一个方法然后将返回一个布尔值。
public async Task LoginAsync(){
await Task.Run(() =>
{
CheckUsernameLogin();
});
}
在发生这种情况时,我也在其他地方更新GUI。我想使用LoginAsync()为boolean分配值,即bool x = LoginAysnc();
。我试过让异步方法看起来像这样
public async Task<bool> LoginAsync(){
return await Task.Run(() =>
{
CheckUsernameLogin();
});
}
然后尝试用这样的bool x = LoginAsync.Result;
分配返回值,但是我的应用程序死了。我这样做是为了检查用户名登录凭据(由CheckUsernameLogin确定)是否有效,同时还更新GUI以保持进度条。我想使用返回的布尔值来根据凭证的有效性创建AlertDialogs。我非常沮丧和卡住。提前致谢。
编辑!
这是另一种方法。有些用户建议将CheckUsernameLogin设为异步,但我不知道在哪里,但await调用。我也知道我的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;
}
答案
按照步骤来实现您的结果:
- 启动动画以显示进度。旋转齿轮(我的个人偏好)比进度条更好。例如
ShowRotatingCog();
- 使用
bool x = await CheckUsernameLogin();
异步激活您的登录用户 - 隐藏cog后显示异步操作的结果。例如
HideRotatingCog(); if(x) Alert("Login Successful"); else Alert("Invalid Login");
另一答案
看起来你正试图从异步中返回同步方法的结果。如果这个假设是正确的,那么你可以写
public async Task<bool> LoginAsync() => await Task.FromResult<bool>(CheckUsernameLogin());
private bool CheckUsernameLogin() => true;
另一答案
public async Task<bool> LoginAsync()
{
bool result = await CheckUsernameLogin();
return result;
}
以上是关于Async Task使用方法[duplicate]返回布尔值的主要内容,如果未能解决你的问题,请参考以下文章