2008-10-28 4 views
2

J'écris une barre d'outils pour IE (6+). J'ai utilisé les différentes barres d'échantillons deProblème de thread/COM/UI possible

codeproject.com (http://www.codeproject.com/KB/dotnet/IE_toolbar.aspx), et d'avoir une barre d'outils qui fonctionne, enregistre les désenregistrements, etc. Ce que je veux faire, c'est de mettre en surbrillance les divs dans une page html comme la souris des utilisateurs se déplace sur ce div. Jusqu'à présent, le code en surbrillance fonctionne, mais je voudrais afficher le nom de la div (si elle existe) dans une étiquette sur la barre d'outils (en changeant à mesure que la souris se déplace, etc.).

Je ne peux pas pour la vie de moi obtenir ce qui se passe et essayer de le déboguer est un cauchemar. Comme l'assembly est hébergé dans IE, je suppose que je provoque une exception (dans IE) en essayant de mettre à jour le texte sur l'étiquette d'un thread qui n'a pas créé ce contrôle, mais parce que cette exception se passe dans IE, je ne le vois pas.

La solution est-elle d'essayer de mettre à jour le contrôle d'une manière thread-safe en utilisant Invoke? Si c'est le cas, comment?

Voici le code d'événement:

private void Explorer_MouseOverEvent(mshtml.IHTMLEventObj e) 
{ 
     mshtml.IHTMLDocument2 doc = this.Explorer.Document as IHTMLDocument2; 
     element = doc.elementFromPoint(e.clientX, e.clientY); 
     if (element.tagName.Equals("DIV", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      element.style.border = "thin solid blue;"; 
      if (element.className != null) 
      { 
       UpdateToolstrip(element.className); 
      } 
     } 
     e.returnValue = false; 
} 

et voici une tentative de mise à jour de thread-safe de la barre d'outils:

delegate void UpdateToolstripDelegate(string text); 

public void UpdateToolstrip(string text) 
{ 
    if (this.toolStripLabel1.InvokeRequired == false) 
    { 
     this.toolStripLabel1.Text = text; 
    } 
    else 
    { 
     this.Invoke(new UpdateToolstripDelegate(UpdateToolstrip), new object[] { text }); 
    } 
} 

Toutes les suggestions très appréciés.

Répondre

1

Je ne peux pas reproduire vraiment la question (la création d'un projet de test pour une barre d'outils IE est un peu trop de travail), mais vous pouvez essayer ceci:

Ajoutez la routine suivante à un public static (méthodes d'extensions) classe:

public static void Invoke(this Control control, MethodInvoker methodInvoker) 
{ 
    if (control.InvokeRequired) 
     control.Invoke(methodInvoker); 
    else 
     methodInvoker(); 
} 

Et puis remplacer la section de code similaire dans le premier bloc avec ceci:

if (element.className != null) 
{ 
    this.Invoke(() => toolStripLabel1.Text = element.className); 
} 

Ceci est un moyen infaillible d'éviter de fil issu sécurité es dans les applications UI.