Laden...

Events und Threads - wie ist der Kontex?

Erstellt von Ichthys vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.828 Views
I
Ichthys Themenstarter:in
136 Beiträge seit 2007
vor 9 Jahren
Events und Threads - wie ist der Kontex?

Hallo,

folgende Problematik: Ich schreibe eine Bibliothek für ein mehrbenutzerfähiges APS.net-System. Die Bibliothek nutzt einen Webdienst, welcher länger andauernde FUnktionen anbietet. Um das Ergebnis abzufragen, werden Events angeboten. Nun habe ich bislang keinen Weg gefunden, wie ich ein Event eindeutig einen bestimmten Nutzer zuorden kann. Daher hatte ich die Idee, dass ich jede Anfrage in einen eingenen Thread packe und in diesem Thread das Ereignis abonniere. So sollte ich, meiner Überlegung nach, die Antworten des Servers eindeutig dem Benutzer zuordnen können. Ist das so richtig? Bleiben die Ergebnisse innerhalb eines Threads oder würde ich so dennoch immer eine beliebige Antwort bekommen und nicht eine speziefische?

VIele Grüße,
Ichthys

Hinweis von herbivore vor 9 Jahren

Ein Event läuft ohne weiteres Zutun in dem Thread, der den Event auslöst. In welchem Event der EventHandler registriert wurde, spielt überhaupt keine Rolle.

T
415 Beiträge seit 2007
vor 9 Jahren

Für diesen Anwendungsfall wäre es wohl sinnvoller die EventArgs einzusetzen. Beim auslösen des Events gibst du den Nutzer in den EventArgs einfach mit.

I
Ichthys Themenstarter:in
136 Beiträge seit 2007
vor 9 Jahren

Soweit so klar, aber wie kann ich das beim Abonnement klären?
Wenn ich über

Class.myEvent += Class_MyEvent;

das Abonnement abschließe, ist das Ganze ja schon vorgegeben. Das Event stammt ja nicht von mir, sondern vom Webdienst und ich muss irgendwie die Antworten dem Nutzer zuordnen.

T
415 Beiträge seit 2007
vor 9 Jahren

Ich hoffe du hast Zugriff auf den Webdienst und kannst dort Veränderungen vornehmen. Davon war ich ausgegangen. Denn sonst ist mein Vorschlag doch nicht praktikabel. Der Dienst nimmt ja für gewöhnlich ein Request entgegen, bearbeitet dieses und antwortet in diesem Fall wohl mit einem Event. Hier müsstest du ansetzen. Im Request den User merken und beim antworten (auslösen des Events) den User wieder mitgeben.

I
Ichthys Themenstarter:in
136 Beiträge seit 2007
vor 9 Jahren

Die Antwortet lautet leider "njet".
Was wäre denn mit einem Lambda-Abonnement? Sprich


int userId = 123;
Class.MyEvent += (sender, o) =>
{
    if(userId == 123)
       process(userId);
} 

Könnte das funktionieren?

916 Beiträge seit 2008
vor 9 Jahren

Die userId wird in deinem Fall Lamda immer userId == 123 sein. So wird es also nicht funktionieren.
Du müsstest die userId im Lamda irgendwie vom WebRequest ermitteln.

Again what learned...

I
Ichthys Themenstarter:in
136 Beiträge seit 2007
vor 9 Jahren

Die ID ist nur ein Beispiel. In Wirklichkeit wäre das ein vom Webserver übergebener Parameter. Die Frage ist nur, wenn der Webserver durch mehrere Webrequests mehrere Anfragen erstellt, werden die Antworten durch den Lambda-Ausdruck immer in die Rechtige Instanz zurückgeschrieben?

916 Beiträge seit 2008
vor 9 Jahren

Wenn das ein und die selbe Instanz von Class ist dann bringt dir das nichts, weil dann immer alle angemeldeten Events gefeuert werden.

Again what learned...

I
Ichthys Themenstarter:in
136 Beiträge seit 2007
vor 9 Jahren

Das ist nicht das Problem, weil die Instanz für jede Abfrage neu erstellt wird. Also sollte es so funktionieren?

916 Beiträge seit 2008
vor 9 Jahren

Diese Frage kann man, ohne zu wissen wann intern das MyEvent gefeuert wird, nicht beantworten.

Again what learned...

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo Ichthys,

wenn du für jeden Request ein neues Objekt der Klasse Class erzeugst und dieses Objekt bei der Beendigung des Requests den Event auslöst, dann kannst du anhand des sender-Parameters unterschieden, welcher Request denn gerade beendet wurde, selbst wenn in den EventArgs nichts dazu steht.

Das sind allerdings Grundlagen.

Das sender-Objekt kannst du also statt deiner ID verwenden. Zum Beispiel auch als Key in einem Dictionary, in dem im Value die benötigten (Zusatz-)Informationen enthalten sind.

herbivore

I
Ichthys Themenstarter:in
136 Beiträge seit 2007
vor 9 Jahren

Hallo herbivore,

vielen Dank für diesen Vorschlag. Daran hatte ich gar nicht gedacht, aber klar, so kann die Unterscheidung funktionieren.

Viele Grüße,
Ichthys