C# 如何进行并行任务并等待任务完成
我有一个动画条,我想在用户单击按钮后显示。随着动画的进行,我需要另一个任务来验证用户信息是否正确(登录)。任务完成后,我希望动画任务停止并显示凭据是否正确 我尝试过做不同的任务,但它变得非常复杂,我开始在复杂的代码中迷失自我 公共异步任务加载animationAsync() //动画 { this.pictureBox1.Hide(); this.badPasswordLabel.Hide(); this.pictureBox2.Hide(); 这个.loadingLabel.Show(); 这个.loadingProgressBar.Show(); this.twitchPicture.Hide(); this.usernameTB.Hide(); this.passwordTB.Hide(); this.loginButton.Hide(); 等待任务。延迟(5000); this.pictureBox1.Show(); this.pictureBox2.Show(); this.loadingLabel.Hide(); this.loadingProgressBar.Hide(); this.twitchPicture.Show(); this.usernameTB.Show(); this.passwordTB.Show(); this.loginButton.Show(); }C# 如何进行并行任务并等待任务完成,c#,task,C#,Task,我有一个动画条,我想在用户单击按钮后显示。随着动画的进行,我需要另一个任务来验证用户信息是否正确(登录)。任务完成后,我希望动画任务停止并显示凭据是否正确 我尝试过做不同的任务,但它变得非常复杂,我开始在复杂的代码中迷失自我 公共异步任务加载animationAsync() //动画 { this.pictureBox1.Hide(); this.badPasswordLabel.Hide(); this.pictureBox2.Hide(); 这个.loadingLabel.Show(); 这
//代码
等待加载animationAsync();
等待任务。运行(()=>
{
bool TryLogin=Login.CheckForCredentials(usernameTB.Text,passwordTB.Text);
if(TryLogin==true)
{
MainPanel.Show();
主面板。BringToFront();
}
其他的
{
这个.badPasswordLabel.Show();
}
});
//凭证检查
公共静态bool CheckForCredentials(字符串用户名、字符串密码)
{
string commandText=“从帐户中选择*,其中用户名=@Username,密码=@Password”;
使用(SqlConnection连接=新的SqlConnection(connectionString))
{
SqlCommand=newsqlcommand(commandText,connection);
command.Parameters.AddWithValue(“@USERNAME”,USERNAME);
command.Parameters.AddWithValue(“@PASSWORD”,PASSWORD);
connection.Open();
SqlDataReader=command.ExecuteReader();
尝试
{
if(reader.Read())
{
string CheckAcc=(string.Format(“{0},{1}”),
读卡器[“用户名”]、读卡器[“密码”]);//等等
如果(检查附件长度>0)
{
控制台写入线(“Ima ga”);
返回true;
}
}
控制台写入线(“Nema ga”);
返回false;
}
最后
{
//阅读完毕后,请始终呼叫Close。
reader.Close();
}
}
}
检查异步凭据,然后您将能够像往常一样编写UI代码,而无需显式创建任务
private async Task<TResult> RequestWithAnimation<TResult>(Func<Task<TResult>> request)
{
this.pictureBox1.Hide();
this.badPasswordLabel.Hide();
this.pictureBox2.Hide();
this.loadingLabel.Show();
this.loadingProgressBar.Show();
this.twitchPicture.Hide();
this.usernameTB.Hide();
this.passwordTB.Hide();
this.loginButton.Hide();
var result = await request();
this.pictureBox1.Show();
this.pictureBox2.Show();
this.loadingLabel.Hide();
this.loadingProgressBar.Hide();
this.twitchPicture.Show();
this.usernameTB.Show();
this.passwordTB.Show();
this.loginButton.Show();
return result;
}
异步检查凭据
public static Task<bool> CheckForCredentialsAsync(string username, string password)
{
var query = "SELECT 1 FROM Account WHERE Username=@USERNAME AND Password=@PASSWORD";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(query, connection))
{
var parameters = new[]
{
new SqlParameter
{
ParameterName = @USERNAME,
SqlDbType = SqlDbType.Varchar,
Size = 100,
Value = username
},
new SqlParameter
{
ParameterName = @PASSWORD,
SqlDbType = SqlDbType.Varchar,
Size = 300,
Value = password
}
};
command.Parameters.AddRange(parameters);
await connection.OpenAsync();
var rowExists = await command.ExecuteScalarAsync();
return rowExists != null;
};
}
公共静态任务CheckForCredentialsAsync(字符串用户名、字符串密码)
{
var query=“从用户名=@Username和密码=@Password的帐户中选择1”;
使用(var连接=新的SqlConnection(connectionString))
使用(var命令=新的SqlCommand(查询、连接))
{
var参数=新[]
{
新的SqlParameter
{
ParameterName=@USERNAME,
SqlDbType=SqlDbType.Varchar,
尺寸=100,
值=用户名
},
新的SqlParameter
{
ParameterName=@密码,
SqlDbType=SqlDbType.Varchar,
尺寸=300,
值=密码
}
};
command.Parameters.AddRange(参数);
等待连接。OpenAsync();
var rowExists=await command.ExecuteScalarAsync();
返回rowExists!=null;
};
}
使用
ExecuteScalar
而不是reader,因为您只想知道行是否存在。与您的问题无关,但您应该删除最后
块,并在SqlCommand命令
和SqlDataReader
上使用using
,就像您在SqlConnection连接上所做的那样。同样与您的问题无关的是,if(CheckAcc.Length>0)
总是true
。我建议您阅读。
public static Task<bool> CheckForCredentialsAsync(string username, string password)
{
var query = "SELECT 1 FROM Account WHERE Username=@USERNAME AND Password=@PASSWORD";
using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(query, connection))
{
var parameters = new[]
{
new SqlParameter
{
ParameterName = @USERNAME,
SqlDbType = SqlDbType.Varchar,
Size = 100,
Value = username
},
new SqlParameter
{
ParameterName = @PASSWORD,
SqlDbType = SqlDbType.Varchar,
Size = 300,
Value = password
}
};
command.Parameters.AddRange(parameters);
await connection.OpenAsync();
var rowExists = await command.ExecuteScalarAsync();
return rowExists != null;
};
}