C# 如何进行并行任务并等待任务完成

C# 如何进行并行任务并等待任务完成,c#,task,C#,Task,我有一个动画条,我想在用户单击按钮后显示。随着动画的进行,我需要另一个任务来验证用户信息是否正确(登录)。任务完成后,我希望动画任务停止并显示凭据是否正确 我尝试过做不同的任务,但它变得非常复杂,我开始在复杂的代码中迷失自我 公共异步任务加载animationAsync() //动画 { this.pictureBox1.Hide(); this.badPasswordLabel.Hide(); this.pictureBox2.Hide(); 这个.loadingLabel.Show(); 这

我有一个动画条,我想在用户单击按钮后显示。随着动画的进行,我需要另一个任务来验证用户信息是否正确(登录)。任务完成后,我希望动画任务停止并显示凭据是否正确

我尝试过做不同的任务,但它变得非常复杂,我开始在复杂的代码中迷失自我

公共异步任务加载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(); }
//代码
等待加载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;
    };
}