c# - 如何解决 "Cross-thread operation not valid"?

标签 c# .net visual-studio multithreading excel

我尝试启动多线程但我不能它返回给我错误:跨线程操作无效:“listBox1”线程已创建以控制来自另一个线程的外部访问。

我的代码:

 
  public DataTable dTable;
        public DataTable dtRowsCount;
        Thread t1;
        ThreadStart ts1;
  void ExcelToSql()
        {
           // SelectDataFromExcel();
            ts1 = new ThreadStart(SelectDataFromExcel);
            t1 = new Thread(ts1);
            t1.Start();
        }
   void SelectDataFromExcel()
        {
            string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Source\Addresses.xlsx;Extended Properties=""Excel 12.0;HDR=YES;""";
            OleDbConnection excelConnection = new OleDbConnection(connectionString);
                      string[] Sheets = new string[] { "Sayfa1"};
            excelConnection.Open(); // This code will open excel file.            
            OleDbCommand dbCommand;
            OleDbDataAdapter dataAdapter;
          //  progressBar1.Minimum = 1;

            foreach (var sheet in Sheets)
            {
                dbCommand = new OleDbCommand("select * From[" + sheet + "$]", excelConnection);
                //progressBar1.Maximum = CountRowsExcel(sheet).Rows.Count;
               // progressBar2.Value = i + 1;
                System.Threading.Thread.Sleep(1000);
                **listBox1.Items.Add("Tablo ismi: "+sheet.ToUpper()+"Satır Adeti: "+CountRowsExcel(sheet).Rows.Count.ToString()+" ");**
                dataAdapter = new OleDbDataAdapter(dbCommand);
                dTable = new DataTable();
                dataAdapter.Fill(dTable);
                dTable.TableName = sheet.ToUpper();
                dTable.Dispose();
                dataAdapter.Dispose();
                dbCommand.Dispose();
                ArrangedDataList(dTable);
                FillSqlTable(dTable, dTable.TableName);
            }

            excelConnection.Close();
            excelConnection.Dispose();
        }

最佳答案

不允许后台线程访问UI组件。

在多线程形式中,我包含这样的代码:

    private delegate void InvokeAction();
    private void DoUI(InvokeAction call) {
        if (IsDisposed) {
            return;
        }
        if (InvokeRequired) {
            try {
                Invoke(call);
            } catch (InvalidOperationException) {
                // Handle error
            }
        } else {
            call();
        }
    }

然后从我的后台线程我可以这样编码:

    // Stuff in other thread
    myVar = GetFromDb();
    DoUI(() => { 
       // Access UI components here 
       listBox1.Items.Add(myVar);
    });
    // More other thread 

关于c# - 如何解决 "Cross-thread operation not valid"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3045941/

相关文章:

c# - Visual Studio 2008 调试器在 C# 解决方案中错误地将 C++ 显示为语言

c++ - 在 Visual Studio C++ 2008 Express 中使用 Boost Asio 构建应用程序时出现链接器错误

visual-studio - 如何从现有解决方案 (.sln) 引导 NAnt 环境

c# - 如何将 Font 保留在继承的 TextBox 中?

.net - 即使在 Regasm 之后,VS 2005 也找不到 .NET DLL 类定义

c# - 锁定集合与 syncRoot 相比有什么缺点吗?

visual-studio - 为什么每次打开 .xaml 文件时我的 Visual Studio 2008 都会关闭?

C# 本地化语言文件 (resx)?

c# - 无法从我的 Windows Phone 8.1 应用程序中的 ListView 拖动项目

c# - AngularJS .Net WebAPI 上传图片并保存到数据库(MSSQL)