如何制作并行任务并等待任务完成

Ki 在贝尔格莱德

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

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

public async Task LoadingAnimationAsync()
//Animation
{
    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();

    await Task.Delay(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();
}
//Code
await LoadingAnimationAsync();

await Task.Run(() =>
{
    bool TryLogin = Login.CheckForCredentials(usernameTB.Text, passwordTB.Text);

    if (TryLogin == true)
    {
        MainPanel.Show();
        MainPanel.BringToFront();
    }
    else
    {
        this.badPasswordLabel.Show();
    }
});
//CredentialsCheck
public static bool CheckForCredentials(string Username, string Password)
{
    string commandText = "SELECT * FROM Account WHERE Username = @USERNAME AND Password = @PASSWORD";

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlCommand command = new SqlCommand(commandText, connection);
        command.Parameters.AddWithValue("@USERNAME", Username);
        command.Parameters.AddWithValue("@PASSWORD", Password);
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
        try
        {
            if (reader.Read())
            {
                string CheckAcc = (String.Format("{0}, {1}",
                reader["Username"], reader["Password"]));// etc
                if (CheckAcc.Length > 0)
                {
                    Console.WriteLine("Ima ga");
                    return true;
                }
            }
            Console.WriteLine("Nema ga");
            return false;
        }
        finally
        {
            // Always call Close when done reading.
            reader.Close();
        }
    }
}

法比奥

异步检查凭据,然后您就可以像往常一样编写 UI 代码,而无需显式创建 Task

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;
}

执行

var credentialsAreValid = 
    await RequestWithAnimation(() => Login.CheckForCredentialsAsync(username, password));

if (credentialsAreValid)
{
    MainPanel.Show();
    MainPanel.BringToFront();
}
else
{
    this.badPasswordLabel.Show();
}

异步检查凭据

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;
    };
}

使用ExecuteScalar而不是阅读器,因为只有您想知道该行是否存在。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章