读取Datatable并在行循环中执行异步c#

时间:2018-09-29 02:13:06

标签: c# winforms asynchronous foreach

我正在尝试在程序中实现异步方法,并且想从数据表中异步读取每一行。 我有以下情况:

   private void VerificarPermissoes()
    {
        try
        {
            string constring = String.Format("server={0}; user id={1}; password={2}; database={3}; pooling=false", AcessoBancoDados.server, AcessoBancoDados.user, AcessoBancoDados.password, AcessoBancoDados.database);

            MySqlConnection con = new MySqlConnection();
            con.ConnectionString = constring;
            con.Open();

            var query = "SELECT id FROM users";

            MySqlCommand cmd = new MySqlCommand(query, con);
            MySqlDataAdapter da = new MySqlDataAdapter(query, con);

            DataTable dt = new DataTable();

            da.Fill(dt);
            con.Close();

            foreach (DataRow item in dt.Rows)
            {
               Messagebox.Show(item["id"].ToString());
            }
    }

调用方法:

private void button1_Click(object sender, EventArgs e)
    {
       VerificarPermissoes()
    }

有人可以为此显示一个异步情况吗?谢谢。

2 个答案:

答案 0 :(得分:0)

好吧,基本上可以通过在c#中创建任务来做到这一点,请参见下面的示例

private void VerificarPermissoes()
    {
        try
        {
            DataTable dt = new DataTable();
            string constring = String.Format("");
            string query = "SELECT id FROM users";

            using (SqlConnection con = new SqlConnection(constring))
            {
                con.Open();

                DbCommand command = con.CreateCommand();
                command.CommandText = query;
                dt.Load(command.ExecuteReader());
            }

            foreach (DataRow item in dt.Rows)
            {
                Task.Factory.StartNew(delegate () { ProcessItem(item["id"].ToString()); });
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void ProcessItem(string item)
    {
        AddControl(myControl, childControl);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        VerificarPermissoes();
    }



    private void AddControl(Control ctrl, Control child)
        {
            if (ctrl.InvokeRequired)
            {
                Action act = delegate () { AddControl(ctrl, child); };
                this.Invoke(act);
            }
            else
            {
                ctrl.Controls.Add(child);
            }
        }

答案 1 :(得分:0)

根据您的评论,您将需要以下类似我的代码的内容。 如果您使用SqlCommand而不是SqlDataAdapter,则您将已经具有异步方法,无需创建任务。

(也不要将ui和数据访问混合使用。请将它们分开。)

    private async void button1_Click(object sender, EventArgs e)
    {
        await VerificarPermissoes();
    }


    private async Task VerificarPermissoes()
    {
        await Task.Run(() =>
        {
              // put your code from above here.
        }); 
    }