Archive for the ‘Virtual Earth’ Category

Virtual Earth in WinForms und der UI Thread

July 18, 2006

Hat man in .net 1.1 ein UI Control aus einem Thread verändert, in dem das Control aber nicht erstellt wurde, führte das meist zu komischen Ergebnissen. In .net 2.0 hat sich hier schon viel getan. Die Methode this.InvokeRequired gibt mir zurück, ob ich mich auf dem UI Thread befinde (oder besser gesagt, ob ich mich eben nicht auf ihn befinde, und so ein Invoke benötige). So lässt sich dann Thread-sicherer Code schreiben à la:

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: Consolas, “Courier New”, Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

   1:  if (this.InvokeRequired)
   2:  {
   3:      // ruf mich selbt noch mal mit delegate über this.Invoke auf
   4:  }
   5:  else
   6:  {
   7:      // der eigentliche Code
   8:  }

Recht nett. Nun binde ich als Virtual Earth als WebBrowser Element in einer WinForms App ein (wunderbares Beispiel auf ViaVirtualEarth, einfach mal die Gallerie durchstöbern und dann manuell die API auf V3 upgraden *G*). Funktioniert alles wunderbar, nur wenn ich eben ein Pin in die Karte zeichnen will, wirft mir .net eine “Invalid Cast Exception”. Hmpf. Ok, aber die Testmethode in OnLoad funktioniert mit den selben Parametern einwandfrei.

Der Betrefft lässt schon erahnen woran es lag. Die Art und Weise wie Virtual Earth in WinForms Apps funktioniert ist der, dass ich über das WebBrowser Control auf die JavaScript Methoden einer Art Proxy HTML Seite aufrufe und Parameter übergebe. Nun habe ich in diesem Fall nicht daran gedacht auf InvokeRequired zu überprüfen, war wohl zu naive. Die Fehlermeldung hat mir in diesem Fall zwar nicht weitergeholfen. WinForms Controls hingegen sagen einem in der Exception, dass man auf dem falschen Thread ist und lassen eine Änderung gar nicht zu. Wieso das auf das WebBrowser Control nicht zutrifft weiß ich nicht.

Naja, auch wieder was dazu gelernt und jetzt erscheinen meine Pins wunderbar wie sie sollen. Bin für heute wieder ein Happy Dev ;)