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
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.
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.
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.
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?
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...
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?
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...
Das ist nicht das Problem, weil die Instanz für jede Abfrage neu erstellt wird. Also sollte es so funktionieren?
Diese Frage kann man, ohne zu wissen wann intern das MyEvent gefeuert wird, nicht beantworten.
Again what learned...
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
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