Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Events und Threads - wie ist der Kontex?
Ichthys
myCSharp.de - Member



Dabei seit:
Beiträge: 136

Themenstarter:

Events und Threads - wie ist der Kontex?

beantworten | zitieren | melden

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

Moderationshinweis von herbivore (03.11.2014 - 14:36:16):

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.

private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 436
Herkunft: Hamburg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Ichthys
myCSharp.de - Member



Dabei seit:
Beiträge: 136

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Ichthys am .
private Nachricht | Beiträge des Benutzers
t2t
myCSharp.de - Member



Dabei seit:
Beiträge: 436
Herkunft: Hamburg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Ichthys
myCSharp.de - Member



Dabei seit:
Beiträge: 136

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Ichthys am .
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 928

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von rollerfreak2 am .
Again what learned...
private Nachricht | Beiträge des Benutzers
Ichthys
myCSharp.de - Member



Dabei seit:
Beiträge: 136

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 928

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Ichthys
myCSharp.de - Member



Dabei seit:
Beiträge: 136

Themenstarter:

beantworten | zitieren | melden

Das ist nicht das Problem, weil die Instanz für jede Abfrage neu erstellt wird. Also sollte es so funktionieren?
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 928

beantworten | zitieren | melden

Diese Frage kann man, ohne zu wissen wann intern das MyEvent gefeuert wird, nicht beantworten.
Again what learned...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Ichthys
myCSharp.de - Member



Dabei seit:
Beiträge: 136

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers