Hallo zusammen,
mir fällt gerade kein passender Titel ein.
Ich rufe mehrfach einen Webservice auf, der mir ein ERgebis zurückliefert.
d.h.
Ich habe eine Liste mit z.B. 5 Positionen.
Diese werden untereinander angezeigt.
Jetzt rufe ich pro Zeile einen Webservice auf, der mir ein Ergebnis zurückliefert.
(Das kann ja manchmal etwas dauern, bis die Antwort kommt)
Nun möchte ich gerne während dem Abruf anzeigen, welche Position gerade angefragt wird.
Ich dachte da an eine kleine Grafik oder so etwas, die symbolisiert, dass das Programm arbeitet.
Wie kann man so etwas darstellen ?
gruß jogi
Nutze doch eine Progressbar oder aktualisiere den Text in der Statusbar.
Da du ja anzeigen willst welche Position verarbeitet wird.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Hallo jogisarge,
noch ein kleiner Tipp vorweg.
Beachte dass du den GUI-Thread nicht blockierst und nicht von dem Worker-Thread auf die GUI zugreifst, weil sonst kracht es.
Siehe dazu: [FAQ] Warum blockiert mein GUI? und [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
Den Zugriff auf den Webservice musst du unbedingt in einen Thread auslagern, weil sonst blockiert dir dieser den GUI-Thread bis er fertig ist.
Gruss
Michael
Hallo,
Nun möchte ich gerne während dem Abruf anzeigen, welche Position gerade angefragt wird.
Ich dachte da an eine kleine Grafik oder so etwas, die symbolisiert, dass das Programm arbeitet.
Du könntest die Liste ja in einem DataGridView anzeigen und in der ersten Spalte dann verschiedene Grafiken nutzen. Einen grünen Haken für Aufgaben die erledigt sind etc...
Das wäre mein erster Ansatz.
Gruß Stephan
Hallo nochmal,
ich habe mich durch einige Threading-Artikel gelesen, und stelle mir folgende Vorgehensweise vor:
Durch einen Button "Start" werden die 5 Positionen gelesen und pro Position ein Webservice in einem eigenen Thread aufgerufen.
Wenn der jeweilige Thread fertig ist feuert er ein Ereignis, welches dann die jeweilige Zeile auf dem GUI aktualisiert.
Wäre das ein richtige Vorgehensweise ?
Nun stellt sich mir aber eine Frage.
Gruß jogi
Hallo,
jein, soweit klingt das schon mal besser.
Aber bei den 5 Positionen.... Handelt es sich da um 5 verschiedene Webservices??
Weil sonst wäre es wohl einfacher alle 5 in einem Rutsch (in einem Thread) auszulesen.
Ansonsten ist es so ok. Wenn die Daten vorhanden sind dann wird ein Event geschmissen und die GUI aktualisiert sich dann.
Wenn es dich stört dass der User weiternavigieren kann dann musst du ein Wartefenster (oder irgend eine Animation drübergelegt) anzeigen um das zu unterbinden.
Wenn es dich nicht stört dann ist das egal. Denn der Webservice schmeisst das Event, aber wenn niemand darauf registriert ist dann passiert halt nix mit den Daten.
Wichtig ist aber dabei noch dass du nicht im Hintergrund X Zombie-Threads laufen hast. Deshalb immer schön brav alles beenden, was nicht gebraucht wird 😃
Gruss
Michael
Hallo nochmal,
mir stellt sich da noch eine Frage:
Wenn ich auf dem GUI 5 Zeilen mit Controls ,die aktualisiert werden sollen, habe - wie erkenne ich die Zeile(Textbox), die gerade aktualisiert werden soll.
Ich hab das jetzt so, dass ich pro WS-Aufruf ein Event werfe, welches dann die Controls auf dem GUI aktualisieren soll.
Gemacht habe ich das wie hier in Eigenen Event definieren / Information zu Events beschrieben.
Wie erkenne ich auf dem GUI welche Zeile gerade dran ist ?
Gruß jogi
Hallo,
Wie erkenne ich auf dem GUI welche Zeile gerade dran ist ?
Da musst du dir merken welcher Webservice zu welcher Zeile gehört (z.b. in einem Dictionary).
Dann kannst du nachher wieder zurückverfolgen was du aktualisieren musst.
Aber das ist IMHO keine wirklich elegante Lösung.
Kannst du die Daten nicht alle in einem Rutsch laden? Oder sind das verschiedene Webservices?
Gruss
Michael
Hallo michlG
Kannst du die Daten nicht alle in einem Rutsch laden? Oder sind das verschiedene Webservices?
Ne das geht nicht.
Das sind verschiedene Lieferanten und somit verschiedene Webservices.
Aber 5 Zeilen bedeutet nicht 5 verschiedene WS.
Es kann auch sein, dass mehrere Artikel von einem Lieferanten kommen.
Hat jemand von euch einen Tipp für mich, wie ich das Problem
Wie erkenne ich auf dem GUI welche Zeile gerade dran ist ?
lösen kann ?
Hallo jogisarge,
ist die Frage nicht vielmehr: Wie bringe ich mein Programm dazu, die aktuelle Zeile hervorgehoben anzuzeigen? Wie wäre es, wenn du einfach die Hintergrundfarbe änderst?
herbivore
Hallo herbivore,
ich möchte nochmal kurz mein Anliegen beschreiben:
Mann kann in einer Liste mit X Artikeln suchen.
Der User markiert über Checkboxen 5 Stück und klickt einen Button.
Nun wird ein Fenster mit den 5 Zeilen gezeigt.
Also eine Zeile pro Artikel.
Jede Zeile besteht aus ein paar Labels und ein paar Textboxen.
Zeile 1 und 2 müssen bei Lieferant a angefragt werden.
Zeile 3 bei Lieferant b und Zeile 4+5 bei Lieferant c.
Der User gibt nun die gewünschte Anfragemenge ein und klickt auf einen Button.
Nun werden im Hintergrund nacheinander die einzelnen WS von der BL abgefragt.
Der WS liefert Werte zurück, die dann in die Felder auf dem GUI geschrieben werden sollen.
Mein jetziger Stand war, dass folgender Ablauf ok wäre:
Durch den Klick auf der GUI wird in der BL pro WS ein Tread gestartet, der dann den WS abfrägt.
Wenn der Thread fertig ist, wird ein Event gefeuert und vom GUI registriert.
Nun die Frage:
Wie kann ich auf dem GUI wissen, welche Zeile aktualisiert werden soll(en)
Hallo jogisarge,
das GUI weiß doch im EventHandler aufgrund des senders, wer den Event gefeuert hat und kann anhand dessen die Zuordnung zur richtigen Zeile vornehmen.
herbivore
Hallo nochmal,
das GUI weiß doch im EventHandler aufgrund des senders, wer den Event gefeuert hat und kann anhand dessen die Zuordnung zur richtigen Zeile vornehmen.
sorry herbivore, aber das kapier ich nicht 🤔
in der BL werden alle zu verarbeitenden Zeilen nacheinander abgearbeitet.
Für jede Zeile wird ein eigener Thread gestartet, welcher dann am Ende ein Event feuert.
wie kann ich jetzt in der GUI erkennen, zu welchen Textboxen der Thread gehört ?
Ich müsste dann pro Zeile, also pro Event-Aufruf zwei Textboxen aktualisieren.
Gruß jogi
Hallo jogisarge,
wie kann ich jetzt in der GUI erkennen, zu welchen Textboxen der Thread gehört ?
Wie herbivore schon gesagt hat kannst du das herausfinden indem du den sender verwendest.
D.h. der Thread gibt zurück zu welcher Textbox er gehört.
Natürlich sollte das getrennt sein (der Thread kennt die TextBox nicht) dann musst du dir halt sonst irgendwie in der GUI die Zugehörigkeit merken.
z.B. über ein Dictionary
Gruß
Michael
Hallo MichlG,
Wie herbivore schon gesagt hat kannst du das herausfinden indem du den sender verwendest.
D.h. der Thread gibt zurück zu welcher Textbox er gehört.
Gelesen habe ich das schon, was herbivore geschrieben hat, aber mir ist nicht klar, wie ich das über den sender übertrage ??
Gruß jogi
Hallo,
guck mal auf den Link: [FAQ] Eigenen Event definieren / Information zu Events
Wenn du das Event auslöst dann kannst du den Sender mitgeben (meistens this).
Und genau dieses object sender, kriegst du dann auch in der GUI raus, wenn du das Event abfängst.
Du kannst aber auch in das EventArgs zusätzlich Daten packen, falls das nötig ist.
Gruß
Michael
Hallo jogisarge,
grundsätzlich muss das GUI ja selbst wissen, was es wo darstellt. Es kann also nur darum gehen, dass das GUI am Ende der Verarbeitung immer noch weiß, was da gerade verarbeitet wurde. Und das kannst du über z.B. über den sender herausfinden. Das GUI hat den Thread ja gestartet, also sollte es auch wissen, welcher Thread welche Daten verarbeitet.
Wenn dir das zu abstrakt oder zu sehr um die Ecke ist, kannst du ja in den (eigenen) EventArgs beliebige (weitere) Informationen übergeben, die die Zuordnung ermöglichen.
Jetzt klarer? Wenn nein, schreibt bitte nicht nur "verstehe ich nicht", sondern schreib genau, was dir unklar ist.
herbivore