C# 将DB代码置于UI线程之外(使用ExecuteReaderAsync或在单独的线程上执行工作(如有必要),并且仅对数据进行马歇尔处理。然后可以使用UI线程上的数据更新UI。您可以像在任何其他情况下一样显示加载动画。我应该如何将多个SQL数据读取器数据封送回

C# 将DB代码置于UI线程之外(使用ExecuteReaderAsync或在单独的线程上执行工作(如有必要),并且仅对数据进行马歇尔处理。然后可以使用UI线程上的数据更新UI。您可以像在任何其他情况下一样显示加载动画。我应该如何将多个SQL数据读取器数据封送回,c#,sql,multithreading,loading,C#,Sql,Multithreading,Loading,将DB代码置于UI线程之外(使用ExecuteReaderAsync或在单独的线程上执行工作(如有必要),并且仅对数据进行马歇尔处理。然后可以使用UI线程上的数据更新UI。您可以像在任何其他情况下一样显示加载动画。我应该如何将多个SQL数据读取器数据封送回UI线程?@Danish_k12一种方式是我回答中的示例代码。如果您至少有.NET 4.5(或带有异步目标包的.NET 4.0),这是您可以使用的最简单、最清晰的方法。 string queryString = "select


将DB代码置于UI线程之外(使用
ExecuteReaderAsync
或在单独的线程上执行工作(如有必要),并且仅对数据进行马歇尔处理。然后可以使用UI线程上的数据更新UI。您可以像在任何其他情况下一样显示加载动画。我应该如何将多个SQL数据读取器数据封送回UI线程?@Danish_k12一种方式是我回答中的示例代码。如果您至少有.NET 4.5(或带有异步目标包的.NET 4.0),这是您可以使用的最简单、最清晰的方法。
        string queryString = "select scanby,count(distinct refno),count(1) from SecRec where scan='Y' and convert(varchar(10),ScanTime,111) like '" + comboDate + "' group by scanby order by 3,2 desc";
        lstVUser.Clear();

        lstVUser.Columns.Add("User", 105);
        lstVUser.Columns.Add("Cust", 60);
        lstVUser.Columns.Add("Imp", 60);

        using (SqlConnection conn = new SqlConnection(connectString))
        {
            SqlCommand cmd = new SqlCommand(queryString, conn);
            try
            {
                conn.Open();
                SqlDataAdapter adp = new SqlDataAdapter(queryString, conn);
                DataTable dt = new DataTable();
                adp.Fill(dt);
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DataRow dr = dt.Rows[i];
                    ListViewItem listitem = new ListViewItem(dr[0].ToString());
                    listitem.SubItems.Add(dr[1].ToString().PadLeft(3));
                    listitem.SubItems.Add(dr[2].ToString().PadLeft(3));
                    lstVUser.Items.Add(listitem);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
async Task<DataTable> LoadData()
{
  // Setup the command, connection etc. as usual
  using (var reader = await command.ExecuteReaderAsync())
  {
    var results = new DataTable();
    results.Load(reader);

    return results;
  }
}

async void btnDoStuff_Click(object sender, EventArgs e)
{
  try
  {
    loadingAnimation.Show();

    var dataTable = await LoadData();

    // Use the data table to bind the ListView's data as usual
  }
  finally
  {
    loadingAnimation.Hide();
  }
}
private delegate void SetListProperties(DataTable myData);

private void UpdateListView(DataTable myData)
{
    if (lstVUser.InvokeRequired)
    {
        SetListProperties d = new SetListProperties(UpdateListView);
        lstVUser.BeginInvoke(d, myData);
    }
    else
    {
       for (int i = 0; i < dt.Rows.Count; i++)
       {
           DataRow dr = dt.Rows[i];
           ListViewItem listitem = new ListViewItem(dr[0].ToString());
           listitem.SubItems.Add(dr[1].ToString().PadLeft(3));
           listitem.SubItems.Add(dr[2].ToString().PadLeft(3));
           lstVUser.Items.Add(listitem);
       }
    }
}