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");
}
}
目前没有任何反应..代码只是在屏幕上以默认形式运行。没有加载值,我做错了什么?
答案 0 :(得分:3)
BGW已经过时了。 TPL,<ul>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
<li><img src="https://placeholdit.imgix.net/~text?txtsize=19&txt=200%C3%97200&w=200&h=200" alt="Demo"></li>
</ul>
和async/await
可以解决使用BGW的所有情况以及更多情况。
在这种情况下,BGW无论如何都不合适。真正的延迟是由数据库调用引起的,而不是加载UI。要异步执行数据库调用,只需使用异步事件处理程序:
IProgress<T>
虽然有更好的方法来加载组合。一个改进是加载列表中的所有项目,然后使用AddRange更新组合。 private async void comboBox4_SelectedIndexChanged(object sender, EventArgs e)
{
var conString=Properties.Settings.Default.MyConnectionString;
string query = "SELECT * FROM dbo.Liguanea_Lane2";
using(var con = new SqlConnection(conString))
using(var cmd = new SqlCommand(query, con))
{
await con.OpenAsync();
var reader=await cmd.ExecuteReader();
while (dr.Read())
{
string scode = dr.GetString(dr.GetOrdinal("code"));
comboBox2.Items.Add(scode);
}
}
}
已调用BeginUpdate以防止在从列表中添加项目时更新UI。
AddRange
更好的是,使用像Dapper这样的微型ORM来摆脱所有这些代码:
var items=new List<string>();
using(var con = new SqlConnection(conString))
using(var cmd = new SqlCommand(query, con))
{
await con.OpenAsync();
var reader=await cmd.ExecuteReader();
while (dr.Read())
{
string scode = dr.GetString(dr.GetOrdinal("code"));
list.Add(scode);
}
}
comboBox2.Items.AddRange(items);