Mehrere Threads abonnieren dasselbe Ereignis

8

Was passiert, wenn 10 Threads dasselbe Ereignis abonnieren und das Ereignis ausgelöst wird? Welcher Thread wird es aufnehmen?

    
koumides 13.08.2010, 19:13
quelle

6 Antworten

16

Threads abonnieren keine Ereignisse, Objekte tun dies. Wenn ein Ereignis ausgelöst wird, werden alle registrierten Handler auf demselben Thread ausgeführt (derjenige, der das Ereignis ausgelöst hat). Es gibt keine integrierte Möglichkeit, Ereignisse auf mehrere Threads auszulösen.

Ein Handler kann auswählen, die Ereignisinformationen bei Bedarf an einen separaten Thread weiterzuleiten, aber das ist nicht Teil des integrierten Mechanismus für die Ereignisverteilung.

    
LBushkin 13.08.2010, 19:17
quelle
3

Wenn Sie unter "Ereignis" ein Win32-Synchronisationsereignis verstehen (wie ich die Frage gelesen habe), hängt es davon ab, wie das EventWaitHandle erstellt wird. Wenn es manuell zurückgesetzt wird, signalisiert das Ereignis alle Threads und alle werden ausgeführt. Wenn es automatisch zurückgesetzt wird, wird ein einzelner Thread signalisiert und ausgeführt. Jeder Ihrer 10 Threads, die auf das Ereignis warten, kann ausgewählt werden.

    
ScottTx 13.08.2010 20:16
quelle
1

Ich denke, was Sie hier meinen, ist, dass mehrere Objekte in separaten Threads ein Ereignis abonnieren.

Alle Handler werden aufgerufen, aber in demselben Thread, der das Ereignis aufgerufen hat.

    
Sandeep Singh Rawat 13.08.2010 19:24
quelle
0

Die Antwort auf Ihre Frage ist, dass es von der Implementierung des Event-Dispatchers abhängt ... Normalerweise verwenden Sie eine Liste, um alle Event-Handler, die ein bestimmtes Event abonniert haben, zu verfolgen Art der Implementierung, der erste Handler, der gefeuert wird, ist der erste Event-Handler, der abonniert wurde, wenn Sie natürlich alle relevanten Prozeduren synchron aufrufen, wenn nicht, dann kommt es darauf an ... nur ein Gedanke ..

    
ultrajohn 13.08.2010 19:27
quelle
0

Wenn Sie wissen möchten, welches Objekt das Ereignis aufnimmt, wird jedes Objekt, das ein Ereignis abonniert hat, dieses Ereignis übernehmen, aber jedes Objekt wird in dem Thread ausgeführt, in dem das Ereignis aufgetreten ist.

Wenn Sie wissen möchten, welches Objekt das Ereignis zuerst aufnehmen wird, sehen Sie sich ultrajohns antwort an.

    
Jack 13.08.2010 19:37
quelle
0

Ich denke, wenn ich deine Frage verstehe. Sie beabsichtigen zu fragen, ob Ihr Objekt ein Ereignis anzeigt, das der Benutzer Ihres Objekts abonnieren kann. Wenn 10 verschiedene Benutzer Ihres Objekts dieses Ereignis abonniert haben und an einem bestimmten Punkt das Ereignis auslösen, würden die Ereignisbehandlungsroutinen aufgerufen (oder gleichzeitig)?

Antwort : Da die Ausführung des Event-Handlers auf demselben Thread ausgeführt wird, der sie auslöst (in diesem Fall der Verarbeitungsthread des Objekts), kann nur eine Handler-Funktion gleichzeitig verarbeitet werden. Die Reihenfolge ist nicht garantiert (was bedeutet, dass nicht notwendigerweise der erste Teilnehmer zuerst ausgeführt würde und der letzte zuletzt ausgeführt würde). Ich hoffe, das beantwortet deine Frage. Die untere Zeile würde alle 10 Handler aufgerufen werden und keiner wäre parallel. Sie werden nacheinander ausgeführt. Ich habe Leute versehentlich tiefgestellt gesehen, um das Ereignis zweimal zu speichern und dann zu sehen, dass die Handlung zweimal passiert und es schwer fällt, herauszufinden, warum einige Dinge mehrmals passieren.

    
Jai MAthur 13.08.2010 20:09
quelle

Tags und Links