Operação de encadeamento cruzado inválida

Duplicar Possível:
Operação de encadeamento cruzado inválida: o controle acessado de um encadeamento diferente do encadeamento em que foi criado

Ok, eu sei porque isso está me dando esse erro:

Operação de encadeamento cruzado inválida: controle ‘Form1’ acessado de um encadeamento diferente do encadeamento em que foi criado.

Mas … como posso fazer isso funcionar?

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(); 

Eu não me importo quando, ou como o Thread termina, então eu realmente não me importo com nada extravagante ou complicado, a menos que isso torne as coisas muito mais fáceis quando estiver trabalhando com a UI em um novo Thread.

Você não pode. As operações da interface do usuário devem ser executadas no encadeamento proprietário. Período.

O que você poderia fazer é criar todos esses itens em um thread filho, depois chamar Control.Invoke e fazer sua binding de dados lá.

Ou use um BackgroundWorker

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

Quando você acessa a propriedade from de outro thread, essa exceção é lançada. Para contornar esse problema, há pelo menos duas opções.

  1. Dizendo controle para não jogar essas exceções (o que não é recomendado):

    Control.CheckForIllegalCrossThreadCalls = false;

  2. Usando funções thread-safe:

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