2008-12-03 6 views
0

Ce code est exécuté de plusieurs façons. Quand il est exécuté par le bouton de formulaire, cela fonctionne (le bouton démarre un thread et dans la boucle il appelle cette méthode = ça marche). MAIS cela ne fonctionne pas quand j'ai un appel à cette méthode de mon BackgroundWorker dans le formulaire.Aidez-moi avec ce CrossThread?

Avec le code suivant:

private void resizeThreadSafe(int width, int height) 
{ 
    if (this.form.InvokeRequired) 
    { 
     this.form.Invoke(new DelegateSize(resizeThreadSafe), 
      new object[] { width, height }); 
    } 
    this.form.Size = new Size(width, height); // problem occurs on this line 
    this.form.Location = new Point(0, 0); // dummy coordinate 
} 

ensuite sur la ligne contenant this.form.Size = ... je reçois l'exception suivante:

InvalidOperationException was unhandled 
Cross-thread operation not valid: Control 'Form1' accessed from a thread other 
than the thread it was created on. 

Pourquoi?

Répondre

6

Vous devez retourner à la fin du bloc if - sinon vous allez le redimensionner dans le bon thread, puis le faire aussi dans le mauvais thread.

En d'autres termes (si vous couper et coller le code au lieu d'une image, cela aurait été plus facile ...)

private void resizeThreadSafe(int width, int height) 
{ 
    if (this.form.InvokeRequired) 
    { 
     this.form.Invoke(new DelegateSize(resizeThreadSafe, 
      new object[] { width, height }); 
     return; 
    } 
    this.form.Size = new Size(width, height); 
    this.form.Location = new Point(0, SystemInformation.MonitorSize // whatever comes next 
} 

Sinon il suffit de mettre la deuxième moitié de la méthode dans un " autre "bloquer.

1

Vous devez écrire ceci:

if (this.form.InvokeRequired) { 
    this.form.Invoke(......); 
    return; 
} 
this.form.Size = new Sizte(...); 

OU

if (this.form.InvokeRequired) { 
    this.form.Invoke(......); 
} 
else { 
    this.form.Size = new Sizte(...); 
} 
1

En fonction de votre style de codage soit utiliser retour juste après l'appel ou de mettre l'action réelle comme bloquer les autres.

Questions connexes