【发布时间】:2016-11-08 15:42:02
【问题描述】:
这是我的后台工作DoWor功能,考虑到GUI操作的实现是否做好了?
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
try
{
string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True";
SqlConnection con = new SqlConnection(connectionString);
con.Open();
string query = "SELECT * FROM dbo.Liguanea_Lane2";
SqlCommand cmd = new SqlCommand(query, con);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
string scode = dr.GetString(dr.GetOrdinal("code"));
comboBox2.Invoke((MethodInvoker)delegate
{
comboBox2.Items.Add(scode);
});
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
这是调用它的函数:
private void comboBox4_SelectedIndexChanged(object sender, EventArgs e)
{
if(comboBox4.SelectedIndex == 0)
{
backgroundWorker1.RunWorkerAsync();
}
else
{
MessageBox.Show("This table doesn't exist within the database");
}
}
目前没有任何反应..代码只是在屏幕上以默认形式运行。没有加载值,我做错了什么?
【问题讨论】:
-
我想您可以通过直接使用按钮调用
backgroundWorker1.RunWorkerAsync();来使您的代码正常工作。但是您的后台工作人员在某种程度上是无用的,因为您在DoWork事件中执行繁重的 UI 任务。 -
但我认为使用方法 Invoker 会有所帮助
-
不,这无济于事。当您使用
Invoke时,您传递给它的操作将在 UI 线程中运行。 -
我只需要了解如何在这些后台工作函数中正确拆分我的代码。这是我现在代码中唯一的问题,因为当大量操作发生时 UI 会冻结。我只是在看你在我上一篇文章中的解释,我不完全明白。
-
BGW 已过时。它所做的任何事情都可以使用
async/await轻松完成。如果您想在后台查询数据库,则必须使用ExecuteReaderAsync。您所要做的就是将您的事件处理程序定义为async void,然后编写var reader=await cmd.ExecuteReaderAsync();
标签: c# winforms backgroundworker