跨线程操作无效

时间:2011-02-18 04:02:09

标签: c# .net winforms multithreading user-interface

  

可能重复:
  Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on

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

  

跨线程操作无效:   控制从线程访问的'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,除非在新的Thread中使用UI时会更容易。< / p>

2 个答案:

答案 0 :(得分:25)

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

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

或使用BackgroundWorker

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

    bw.RunWorkerAsync();

答案 1 :(得分:13)

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

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

    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
        }
    }