Wenn man mal eine Form braucht

Vorgeschichte

Das ist man an einem Samstag mal hoch motiviert sich schnell anzusehen, warum der ‚Handscanner‘ nicht mehr läuft. Der wäre gerade jetzt praktisch, wo ich nach einem Festival wieder zahlreiche CDs mit nach Hause gebracht habe.
Also habe ich das Xamarin Android Projekt geöffnet, dass sich prompt aufgrund fehlender Aktualisierungen nicht mehr kompilieren lässt. Also erst einmal alles nachinstalliert, nur um am Ende festzustellen: Mein CD-Manager ist das Problem.
Früher hatte ich für den Handscanner ein eigenes kleines Tool, doch ich habe den Code dann in den CD-Manager integriert, damit ich nicht mit SendMessage irgendwelche Nachrichten durch die Gegend schicken muss. Ausprobiert habe ich das aber wohl nicht, denn …

Tasks & STA Threads

Leider funktionierte das nicht mehr, dass ich mit meiner Android App CDs scanne und der CD-Manager den Editor öffnet und die Daten von Amazon abruft. Doch warum? Der Fehler war schnell gefunden. Der Thread der auf die Android-Messages hört, wird über einen Task gestartet. Dieser öffnet später eine Form und da zerlegt es den ganzen Code. Der Fehler war in etwa ‚The calling thread must be STA‘.
Daraufhin habe ich einiges versucht.

  • Dem Task den TaskSheduler mitgeben (TaskScheduler.FromCurrentSynchronizationContext())
  • Normalen Thread starten und SetApartmentState(ApartmentState.STA) setzten
  • Einen Backgroundworker verwenden

Alles ohne Erfolg. Da ich mich im Presenter meiner Anwendung befand, hatte ich auch keine Form auf die ich ein Invoke aufrufen konnte um das ganze wieder in den UI Thread zu bekommen. Irgendwann hatte ich keine Lust mehr und klagte in der darauffolgende Woche einem meiner Kollegen mein Leid. Da meinte dieser: „Versuch doch mal Application.OpenForms[0].Invoke()“
Und siehe da – alles läuft wie gewünscht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert