2010-07-19 5 views
1

J'ai une boîte de dialogue Windows Forms, où une opération plus longue est en cours (asynchron) dans un travail backgroundworker. Pendant cette opération je veux changer certaines valeurs sur le formulaire (étiquettes, ...). Mais lorsque l'arrière-plan tente de modifier quelque chose sur le formulaire, j'obtiens l'erreur "Opération croisée pas valide"! Comment ce problème peut-il être résolu?Comment résoudre le problème "Opération croisée pas valide" Problème?

+1

Ceci est expliqué ici: http://msdn.microsoft.com/en- us/library/ms993020 –

+0

Mieux vaut commencer ici: http://msdn.microsoft.com/en-us/library/ms951089 Au début de la série! –

Répondre

3

Appelez la méthode ReportProgress du travailleur, et gérer la ProgressChanged de mettre à jour l'état actuel.

2

Vérifiez si l'appel est requis, puis appelez BeginInvoke.

private void AdjustControls() 
     { 
      if (this.InvokeRequired) 
      { 
       this.Invoke(new MethodInvoker(this.AdjustControls)); 
      } 
      else 
      { 
       label1.Text = "Whatever"; 
      } 
     } 
+0

J'ai essayé ceci. Mais ça ne marche pas. Pouvez-vous me donner plus de détails. Merci d'avance! – uhu

+0

Désolé ma mauvaise, je l'ai réparé un peu. Si AdjustControls prend des paramètres, par exemple, s'il s'agit d'un gestionnaire d'événements, vous ne pouvez pas utiliser MethodInvoker, vous devez définir un délégué pour cela. – Kurt

1

Je me sens un peu bizarre en train de creuser ma propre corne ici, mais vous pouvez trouver un peu d'utilisation de la bibliothèque ThreadSafeControls que j'ai écrite exactement dans ce but.

1

Vous ne pouvez pas modifier les contrôles directement dans un thread qui ne les a pas créés. Vous pouvez utiliser une méthode invoke comme indiqué ci-dessus ou vous pouvez utiliser l'événement BackgroundWorker ProgressChanged.

code utilisé à l'intérieur BackgroundWorker DoWork:

myBackgroundWorker.ReportProgress(50); // Report that the background worker has got to 50% of completing its operations. 

code utilisé à l'intérieur BackgroundWorker ProgressChanged:

progressBar1.Value = e.ProgressPercentage; // Change a progressbar on the WinForm 
Questions connexes