web-dev-qa-db-fra.com

Opération inter-thread non valide

Duplicata possible:
Opération inter-thread non valide: contrôle accessible à partir d'un thread autre que le thread sur lequel il a été créé

D'accord, je sais pourquoi cela me donne cette erreur:

Opération inter-thread non valide: Contrôlez 'Form1' accessible à partir d'un thread autre que le thread sur lequel il a été créé.

Mais ... Comment puis-je rendre cela réalisable?

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

Je ne me soucie pas quand ni comment le thread se termine, donc je ne me soucie pas vraiment de quelque chose de compliqué ou d'atmosphère compliquée, à moins que cela ne facilite les choses lorsque vous travaillez avec l'interface utilisateur dans un nouveau thread.

32
anon271334

Tu ne peux pas. Les opérations d'interface utilisateur doivent être effectuées sur le thread propriétaire. Période.

Ce que vous pourriez faire, c'est créer tous ces éléments sur un thread enfant, puis appeler Control.Invoke et faites votre liaison de données là-bas.

Ou utilisez un BackgroundWorker

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

    bw.RunWorkerAsync();
25
Adam Rackis

Lorsque vous accédez à la propriété from à partir d'un autre thread, cette exception est levée. Pour contourner ce problème, il existe au moins 2 options.

  1. Dire à Control de ne pas lever ces exceptions (ce qui n'est pas recommandé):

    Control.CheckForIllegalCrossThreadCalls = false;

  2. Utilisation des fonctions threadsafe:

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