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