跨线程操作无效

可能重复:
跨线程操作无效:从创建它的线程以外的线程访问控制

好的,我知道为什么这会给我这个错误:

跨线程操作无效:控制从其创建的线程以外的线程访问的“Form1”。

但是……我怎样才能使这个可行?

System.Threading.Thread t = new System.Threading.Thread(()=> { // do really hard work and then... listView1.Items.Add(lots of items); lots more UI work }); t.Start(); 

我不关心Thread何时或如何完成,所以我并不关心任何花哨或过于复杂的atm,除非它在使用新线程中的UI时会更容易。

你不能。 必须在拥有的线程上执行UI操作。 期。

可以做的是在子线程上创建所有这些项目,然后调用Control.Invoke并在那里进行数据绑定。

或者使用BackgroundWorker

  BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += (s, e) => { /* create items */ }; bw.RunWorkerCompleted += (s, e) => { /* databind UI element*/ }; bw.RunWorkerAsync(); 

从另一个线程访问from的属性时,抛出此exception。 要解决此问题,至少有两个选项。

  1. 告诉控制不要抛出这些exception(不推荐):

    Control.CheckForIllegalCrossThreadCalls = false;

  2. 使用线程安全函数:

     private void ThreadSafeFunction(int intVal, bool boolVal) { if (this.InvokeRequired) { this.Invoke( new MethodInvoker( delegate() { ThreadSafeFunction(intVal, boolVal); })); } else { //use intval and boolval } }