【问题标题】:Read Datatable and do a loop in rows async c#读取数据表并在行中执行循环异步 c#
【发布时间】:2018-09-29 02:13:05
【问题描述】:

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

   private void VerifyPermissions()
    {
        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)
    {
       VerifyPermissions()
    }

任何人都可以向我展示一个异步情况吗?谢谢。

【问题讨论】:

  • 为什么要做异步?
  • 在 foreach 部分中,我必须将控件添加到 flowlayout。如果 select 语句很大,它会冻结 ui 一段时间。我想绕过那个冻结...
  • 所有控件都应该添加到 UI 线程中,异步添加到 UI 中没有意义。如果您的问题是由于打开连接和加载数据而导致 UI 冻结,您可以load data into data table asynchronously

标签: c# winforms asynchronous foreach


【解决方案1】:

根据您的评论,您需要下面的代码。 如果您使用 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.
        }); 
    }

【讨论】:

    【解决方案2】:

    嗯,你基本上可以通过在 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);
                }
            }
    

    【讨论】:

    • 您好布鲁诺,感谢您的回复。在这段代码中,我ve tried to add controls to a flowlayout panel in ProcessItem method but it returns exceptions in Output. Ive 试过这个: UserTag ut = new UserTag(); flowLayoutPanel2.Controls.Add(ut);
    • 为此,您必须调用一个操作。通过调用一个方法,这意味着这段代码将在你程序的主线程中运行,然后你可以对 UI 执行操作。
    猜你喜欢
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 2020-02-04
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多