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

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条评论
登录后参与评论

相关文章

来自分类Dev

如何等待任务完成

来自分类Dev

我应该如何等待GCD中并行异步任务的完成?

来自分类Dev

等待异步任务完成

来自分类Dev

等待异步任务完成

来自分类Dev

任务不等待完成

来自分类Dev

等待异步任务完成

来自分类Dev

任务不等待完成

来自分类Dev

如何等待IntentService完成其任务

来自分类Dev

如何等待IntentService完成其任务

来自分类Dev

NodeJS如何等待多任务完成

来自分类Dev

如何等待任务的完成及其继续?

来自分类Dev

如何循环创建任务并等待所有任务完成

来自分类Dev

父任务不等待子任务完成

来自分类Dev

任务不等待ContinueWith完成

来自分类Dev

等待所有任务完成

来自分类Dev

Android:等待多个任务完成

来自分类Dev

开始任务,稍后等待完成

来自分类Dev

等待任务完成异步httpwebrequest

来自分类Dev

我的任务不是在等待完成

来自分类Dev

Gradle任务:如何等待文件操作完成

来自分类Dev

如何等待直到Task.ContinueWith内部任务完成

来自分类Dev

如何等待Java中的多个任务完成?

来自分类Dev

如何使python等待上一个任务完成?

来自分类Dev

如何等待create_task()创建的任务完成?

来自分类Dev

如何仅等待第一个任务完成

来自分类Dev

如何使Parallel等待所有异步任务完成?

来自分类Dev

如何使python等待上一个任务完成?

来自分类Dev

如何获取异步代码以等待所有任务完成?

来自分类Dev

如何强制 Paralled.Invoke 等待所有任务完成?