如何解决“跨线程操作无效”?

我尝试启动multithreading,但我不能它返回给我错误: 跨线程操作无效:'listBox1'线程被创build来控制从另一个线程的外部访问了。

MyCodes:

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组件。

在multithreading表单中,我包含这样的代码:

  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 

在UI线程中创build的控件不能以其他线程以正常方式访问。 请创build一个委托,并使用control.Invoke调用委托。

无论您所在的线程环境如何,下面提供的方法示例都可用于启用button的可见性。

 private void EnableButtonVisibility( Button btn, bool enable) { if ( !btn.InvokeRequired ) { btn.Visible = enable; } else { btn.Invoke( new EnableButtonVisibilityHandler( EnableButtonVisibility ), btn, enable ); } } delegate void EnableButtonVisibilityHandler( Button btn, bool enable); 

您无法从非UI线程更新UI组件。 使用TaskScheduler.FromCurrentSynchronizationContextTaskScheduler.FromCurrentSynchronizationContext送对UI线程的调用。