使用另一个线程将数据从数据库加载到组合框
本文关键字:加载 数据库 组合 数据 另一个 线程 | 更新日期: 2023-09-27 18:29:47
从数据库表中获取列后,我想在组合框中添加项。为了达到性能,我把这个任务放在一个新创建的线程中
for (int i = 0; i < dataTable.Rows.Count; i++)
{
comboBox.Items.Add(dataTable.Rows[i][0].ToString());
}
但它给出了以下例外:
"跨线程操作无效"
我搜索了它,并试图在不同方法的帮助下解决这个问题,代表们。我试图将整个dataTable传递给另一个方法,但无法解决问题。
请告诉我该怎么解决?
只需将代码包装在传递给BeginInvoke
:的委托中
comboBox.BeginInvoke(
(Action)(() =>
{
for (int i = 0; i < dataTable.Rows.Count; i++)
{
comboBox.Items.Add(dataTable.Rows[i][0].ToString());
}
}));
通过这种方式,您可以将更新转发到GUI线程,因为它是唯一允许对GUI进行更改的线程。
您可以(也可能应该)在后台线程上运行数据库查询,但必须更新UI线程上的UI控件。这就是Windows的工作方式。
您的线程不是UI线程。只有UI线程可以访问UI控件,如组合框因此,更新组合框项的方法应该检查它是否是从UI线程调用的,如果不是,则在尝试使用组合框之前切换到该线程。
public delegate void OnAddTable(DataTable dataTable);
private void AddTable(DataTable dataTable)
{
if(this.InvokeRequired)
{
this.BeginInvoke(new OnAddTable(AddTable), new object[] {dataTable}));
return;
}
for (int i = 0; i < dataTable.Rows.Count; i++)
{
comboBox.Items.Add(dataTable.Rows[i][0].ToString());
}
}