J'ai récemment mis à jour une application de VS2003 à VS2008 et je savais que je ferais face à une foule de "opération croisée pas valide: Contrôle 'myControl' accédé à partir d'un thread autre que le fil il était créé sur "Je gère cela dans ce que je crois est la bonne façon (voir l'exemple de code ci-dessous). Je cours dans de nombreux contrôles qui vont avoir besoin d'une solution similaire. Ne voulant pas avoir un code similaire pour chaque label, textbox etc. auquel un thread non UI accède. Quelles sont les ramifications de simplement définir le CheckForIllegalCrossThreadCalls = false pour l'application entière?Ramifications de CheckForIllegalCrossThreadCalls = false
J'ai trouvé un article CodeProject avec diverses solutions de contournement et un avertissement en bas pour ne pas définir la propriété. Je suis à la recherche d'autres opinions/expériences sur ce sujet.
private void ShowStatus(string szStatus)
{
try
{
if (this.statusBar1.InvokeRequired) { BeginInvoke(new MethodInvoker(delegate() { ShowStatus(szStatus); })); }
else { statusBar1.Panels[0].Text = szStatus; }
}
catch (Exception ex)
{
LogStatus.WriteErrorLog(ex, "Error", "frmMNI.ShowStatus()");
}
}
Je trouve un autre article avec quelques solutions possibles SO Question 2367718
+1 - J'ai eu que très citation sur mon presse-papiers, quand je rafraîchi la page avant de poster une réponse ... –
Control.Invoke semble être ce que je cherche. J'ai des données qui reviennent sur un thread NON-UI et définissant une douzaine de boîtes de texte, étiquettes, etc .. Si je pouvais le rassembler en un balayage ce serait génial. –
@Ron: Oui, vous pouvez rassembler tout le code de l'interface utilisateur en un seul balayage. Utiliser la syntaxe lambda (puisque vous êtes dans VS2008) vous permet de le faire "en ligne" dans votre méthode, et pas besoin de faire un délégué bizarre à passer, aussi ... –