C# - Events zwischen threads ausgeführt werden in Ihrem eigenen thread (Wie)?
Ich würde gerne zwei Threads. Nennen wir Sie :
- Thread Ein
- Thread B
Thread feuert ein event-und thread B hören Sie zu diesem Ereignis.
Wenn der Thread B Ereignis-Listener ausgeführt wird, ausgeführt wird, mit dem Thread Eine thread-ID, so dass ich denke, es wird ausgeführt, innerhalb des Thread A.
Was ich tun möchte, ist in der Lage, Feuer-event, Thread B etwas zu sagen wie: "hey, ein Daten-bereit für Sie, Sie behandeln können Sie es jetzt". Dieses Ereignis muss in einem eigenen Thread ausgeführt, da es verwendet Dinge, die nur ihn zugreifen kann (wie die UI-Steuerelemente).
Wie kann ich das tun ?
Danke für Sie Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie Marschall die Informationen wieder in den UI-thread.
In der Regel, Sie würde damit umgehen können Sie in Ihrem Ereignis-handler. Zum Beispiel, sagen Ein Thread war dein UI-thread - wenn es abonniert ein Ereignis auf ein Objekt in Thread B, der event-handler wird ausgeführt, innen-Gewinde B. Allerdings kann es dann einfach Marschall diese wieder in den UI-thread:
need to marshal the information back
, wie ich weiß, Marshalling erforderlich für cross-Prozess und Wohnung. Warum Marschall, wenn diese threads im gleichen Prozess? (und keine Wohnung, da COM nicht verwendet wird).Der einfachste Weg ist wahrscheinlich zu abonnieren, event-handler, die nur Marschall der "echten" hf call auf thread B Für die Instanz, die handler nennen könnte
Control.BeginInvoke
um einige Arbeit zu tun auf thread B:Wenn Sie mit Windows Forms oder WPF, und nicht über eine Control-Referenz-handy von Ihrem event-Handler, Sie konnte darüber hinaus die Erfassung der Referenz von System.Threading.SynchronizationContext.Aktuelle in etwas läuft auf dem UI-thread und setzen, dass der Verweis auf Ihre Ereignishandler.
Dann, wenn Sie etwas haben müssen, laufen auf dem UI-thread aufrufen Post() oder Send() auf die erfassten SynchronizationContext Verweis aus Ihrem event-handler, je nachdem, ob Sie wollen, dass es ausgeführt werden asynchron oder synchron.
Im Grunde ist dies nur Zucker um die Erfassung einer Kontrolle Referenz und ruft Invoke() auf Sie, aber machen den code einfacher.