Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用另一个线程将数据从数据库加载到组合框_C#_Sql Server_Database_Winforms_Multithreading - Fatal编程技术网

C# 使用另一个线程将数据从数据库加载到组合框

C# 使用另一个线程将数据从数据库加载到组合框,c#,sql-server,database,winforms,multithreading,C#,Sql Server,Database,Winforms,Multithreading,我想在从数据库表中获取一列后在组合框中添加项。为了实现性能,我将此任务放置在新创建的线程中 for (int i = 0; i < dataTable.Rows.Count; i++) { comboBox.Items.Add(dataTable.Rows[i][0].ToString()); } for(int i=0;i

我想在从数据库表中获取一列后在组合框中添加项。为了实现性能,我将此任务放置在新创建的线程中

for (int i = 0; i < dataTable.Rows.Count; i++)
{
    comboBox.Items.Add(dataTable.Rows[i][0].ToString());
}
for(int i=0;i
但它给出了以下例外情况:

“跨线程操作无效”

代表们,我搜索了它,并试图借助不同的方法解决这个问题。我试图将整个数据表传递给另一个方法,但无法解决问题


请告诉我如何解决此问题?

您可以(也可能应该)在后台线程上运行数据库查询,但必须更新UI线程上的UI控件。这就是Windows的工作方式。

您的线程不是UI线程。只有UI线程才能访问像combobox这样的UI控件 因此,更新combobox项目的方法应该检查它是否是从UI线程调用的,并且(如果不是)在尝试使用combobox之前切换到该线程

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()); 
    }
} 
public委托在addtable(DataTable)上无效;
私有void AddTable(数据表数据表)
{
if(this.invokererequired)
{
this.BeginInvoke(新的OnAddTable(AddTable),新的对象[]{dataTable});
返回;
}
for(int i=0;i
只需将代码包装在传递给
BeginInvoke
的委托中:

comboBox.BeginInvoke(
    (Action)(() =>
    {
       for (int i = 0; i < dataTable.Rows.Count; i++)
       {
          comboBox.Items.Add(dataTable.Rows[i][0].ToString());
       }
    }));
comboBox.BeginInvoke(
(行动)(()=>
{
for(int i=0;i
通过这种方式,您可以将更新转发到GUI线程,因为它是唯一允许在GUI上进行更改的线程