2009-05-16 6 views
0
 if (listBox1.InvokeRequired) 
     { 
      listBox = new StringBuilder(this.listBox1.Text); 
     } 

Ceci est le code C# qui, lorsqu'il est exécuté produit une erreur d'opération de fil de croix non valide pour listBox1 qui est une zone de liste dans ma forme. Pourriez-vous les gars s'il vous plaît dites-moi pourquoi? J'utilise aussi la méthode invokeRequired et je ne change pas non plus le contenu de la listbox. InvokeRequired vérifie simplement si Invoke est requis.erreur opérations crossthread

Répondre

5

Cela ne rend pas l'accès légal. Vous devez utiliser la méthode Invoke pour pousser la mise à jour du fil approprié

Action update =() => listbox = new StringBuilder(this.listBox1.Text); 
if (listBox1.InvokeRequired) { 
    listBox1.Invoke(update); 
} else { 
    update(); 
} 
+0

Je pensais que le style de corset à MS était accolade sur la ligne séparat?!? ;) –

+0

@Mitch, MS n'a pas de style officiel, mais beaucoup de groupes utilisent l'accolade sur la règle de retour à la ligne. C'est aussi ma préférence pour les langages de style C. Mais quand je poste du code sur le web, j'utilise le même style de ligne pour rendre les exemples plus succincts :) – JaredPar

+0

Le projet Mono spécifie en fait la même pratique pour toutes ses sources, allant complètement à l'encontre des directives Microsoft/StyleCop - et ce n'est pas la seule chose qu'ils font contraste. Là encore, pourquoi devraient-ils suivre l'exemple de Microsoft? Je me demande s'ils veulent juste contrarier les développeurs MS, cependant. : P Le style même ligne semble personnellement un peu moche pour moi, même si c'est peut-être juste habbit. De toute façon, c'est certainement * acceptable *. – Noldorin

3

Vous avez trouvé cela nécessaire, mais n'a pas appelé Invoke! InvokeRequired ne vous indique qu'une invocation est nécessaire afin d'accéder validement à l'élément.

2

Votre code doit exécuter lorsque InvokeRequired est faux

delegate void SetListBoxDelegate(); 

void SetListBox() 
{ 
    if(!InvokeRequired) 
    { 
     listBox = new StringBuilder(this.listBox1.Text); 
    } 
    else 
     Invoke(new SetListBoxDelegate(SetListBox)); 
} 

Edit: Check out Making Windows Forms thread safe