c# - 使用方法返回布尔值的异步任务
问题描述
我有一个异步任务,我用它来调用一个方法,然后将返回一个布尔值。
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;
}
解决方案
按照以下步骤实现您的结果:
启动动画以显示进度。旋转齿轮(我个人的偏好)比进度条更好。例如
ShowRotatingCog();
使用异步触发您的登录用户
bool x = await CheckUsernameLogin();
隐藏 cog 后显示异步操作的结果。例如
HideRotatingCog(); if(x) Alert("Login Successful"); else Alert("Invalid Login");
推荐阅读
- ios - Swift 4:如果在 Deep Link 中有参数,则转到另一个屏幕
- vb.net - 无法将参数传递到 .rdlc 文件
- java - 如果我先降低位图质量然后重新调整其高度/宽度大小,如果我反过来做会有区别吗?
- swift - 再次推送 VC 后约束被打破
- sql - Oracle SQL 根据开始和结束将行拆分为多个条目
- python - 如何使用时间序列中的值创建时间间隔数据框?
- java - 当我启用位置单击确定按钮时,OnAtivity 导致片段对我不起作用
- spring - 缺少对演示 (https://spring.io/quickstart) 的依赖?
- rx-swift - 如何在 RxSwift 中按顺序和非并行循环遍历数组?
- python-3.x - 如何使用任何打印或提取 div 类中的文本
或等使用 BeautifulSoup 和 Python3.x?