none
Frage zu einer multi thread Anwendung RRS feed

  • Frage

  • Hallo NG,

    ich möchte Daten über eine SOAP Schnittstelle in eigenen Threads an einen Server senden und diese Daten verarbeiten.

    Für jeden Auftrag erzeuge ich einen eigenen Thread der diesen abarbeitet. Wenn in dem Thread eine Exception auftritt, dann ruft der Thread über eine Action<MySOAPException> den UI Thread auf dieser öffnet einen Dialog und zeigt den Anwender die Fehlerbeschreibung an.

    So weit klappt eigentlich alles. Nun meine Frage:

    Wenn eine Exception in der UI Thread kommt und der Dialog geöffnet ist, wie kann ich das handeln, wenn dann weitere Exceptions kommen ?

    Danke für jeden Hinweis und Tipp.

    Grüße Ingo

    Donnerstag, 8. August 2013 23:12

Antworten

  • Hi Ingo,
    Deine Frage lässt sich einfach mit einer Queue lösen. Jeder Auftrag, der in einem eignen thread läuft, legt in der Queue ein Info-Objekt ab und signalisiert das Ereignis. In das Info-Objekt werden alle Daten abgelegt, die für die spätere Auswertung benötigt werden. Für die Verwaltung der Queue wird ein separater thread benötigt, der auf das Signal wartet. Wenn das Signal eintrifft, verarbeitet er das älteste Info-Objekt in der Queue und ruft beispielsweise mittels Invoke eine Methode im Haupt-thread ab. In der Zwischenzeit können weitere Info-Objekte von den Auftrags-threads in die Queue eingereiht werden. Nach Beendigung der Verarbeitung eines Info-Objektes wird geprüft, ob weitere Info-Objekte zwischenzeitlich in die Queue eingereiht wurden. Diese Verarbeitungsschleife wird solange ausgeführt, bis die Queue leer ist, d.h. keine Info-Objekte mehr anliegen und der Verarbeitungs-thread geht ins Warten. Für die Signalisierung kann ein AotoResetEvent genutzt werden.

    Alternativ wären auch asynchrone Invokes denkbar. Problematisch können dabei aber Rückmeldungen werden, die u.U. benötigt werden.

    --
    Peter

    • Als Antwort markiert IngoManthey Freitag, 9. August 2013 10:21
    Freitag, 9. August 2013 04:07

Alle Antworten

  • Hi Ingo,
    Deine Frage lässt sich einfach mit einer Queue lösen. Jeder Auftrag, der in einem eignen thread läuft, legt in der Queue ein Info-Objekt ab und signalisiert das Ereignis. In das Info-Objekt werden alle Daten abgelegt, die für die spätere Auswertung benötigt werden. Für die Verwaltung der Queue wird ein separater thread benötigt, der auf das Signal wartet. Wenn das Signal eintrifft, verarbeitet er das älteste Info-Objekt in der Queue und ruft beispielsweise mittels Invoke eine Methode im Haupt-thread ab. In der Zwischenzeit können weitere Info-Objekte von den Auftrags-threads in die Queue eingereiht werden. Nach Beendigung der Verarbeitung eines Info-Objektes wird geprüft, ob weitere Info-Objekte zwischenzeitlich in die Queue eingereiht wurden. Diese Verarbeitungsschleife wird solange ausgeführt, bis die Queue leer ist, d.h. keine Info-Objekte mehr anliegen und der Verarbeitungs-thread geht ins Warten. Für die Signalisierung kann ein AotoResetEvent genutzt werden.

    Alternativ wären auch asynchrone Invokes denkbar. Problematisch können dabei aber Rückmeldungen werden, die u.U. benötigt werden.

    --
    Peter

    • Als Antwort markiert IngoManthey Freitag, 9. August 2013 10:21
    Freitag, 9. August 2013 04:07
  • Hallo Peter,

    danke, das war es!!

    Grüße Ingo

    Freitag, 9. August 2013 10:26