EDIT: Ich denke, Sie wollen wahrscheinlich die Klasse System.Threading.AutoResetEvent verwenden. In der MSDN-Dokumentation finden Sie ein anständiges Beispiel für einen Thread, der auf einen anderen wartet, das meiner Meinung nach dem ähnelt, was Sie zu tun versuchen: http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx Achten Sie insbesondere auf die Aufrufe von trigger.WaitOne() und trigger.Set()
EDIT2: Option #3 hinzugefügt, nachdem ich den neuen Kommentar von OP gelesen habe.
"Wann immer ich die Methoden eines Objekts aufrufe, das auf Thread A läuft ..." - Ein Objekt "läuft" nicht auf einem Thread und ist nicht wirklich Eigentum eines Threads, unabhängig davon, welcher Thread das Objekt erstellt hat.
Da sich Ihre Frage auf "Nicht-UI-Cross-Thread-Aufrufe" bezieht, gehe ich davon aus, dass Sie bereits mit "UI-Cross-Thread-Aufrufen" vertraut sind. Ich kann mir vorstellen, dass WinForms Ihnen den Eindruck vermittelt, dass ein Thread ein Objekt besitzt und dass Sie eine Nachricht an einen Thread senden müssen, damit dieser etwas tut.
WinForm-Steuerungsobjekte sind insofern ein Sonderfall, als sie einfach nicht richtig funktionieren, wenn Sie mit ihnen über einen Thread interagieren, der nicht derjenige ist, der sie erstellt hat, aber das liegt nicht an der Art und Weise, wie Threads und Objekte interagieren.
Nun aber zu Ihrer Frage.
Zunächst eine Frage zur Klärung des Problems: Sie haben erwähnt, was Thread B tut, aber was tut Thread A, bevor er von Thread B "aufgerufen" wird?
Hier sind ein paar Ideen, die meiner Meinung nach dem entsprechen, was Sie tun möchten:
-
Legen Sie Thread A erst an, wenn Sie ihn brauchen. Anstatt Thread B zu veranlassen, "eine Nachricht an Thread A zu senden", sollten Sie lieber Thread B veranlassen, Thread A zu erstellen (oder ihn Thread C nennen, wenn Sie dies bevorzugen) und ihn zu diesem Zeitpunkt mit der Ausführung beginnen lassen.
-
Wenn Sie benötigen, dass Thread A bereits existiert und Sie möchten, dass Thread A die Ereignisse von Thread B nur einzeln bearbeitet, können Sie Thread A warten lassen, bis er eine Benachrichtigung von Thread B erhält. die Klasse System.Threading.WaitHandle (abgeleitete Klassen von Interesse sind ManualResetEvent und AutoResetEvent).
Thread A wird irgendwann WaitHandle.WaitOne() aufrufen, was ihn dazu veranlasst, eine Pause einzulegen und zu warten, bis Thread B WaitHandle.Set() für dasselbe WaitHandle-Objekt aufruft.
-
Wenn Thread A mit anderen Dingen beschäftigt ist, sollten Sie vielleicht eine Art Flag-Variable einrichten. Ähnlich wie das WaitHandle-Konzept in Nr. 2, aber anstatt Thread A zum Anhalten zu veranlassen, soll Thread B einfach ein Flag setzen (vielleicht nur eine boolesche Variable), das Thread A signalisiert, dass er etwas tun muss. Während Thread A mit anderen Dingen beschäftigt ist, kann er dieses Flag regelmäßig überprüfen, um zu entscheiden, ob etwas zu tun ist oder nicht.
Erfordert die Methode, die Thread A auf Ihrem Objekt ausführt, irgendeine Eingabe von Thread B? Dann lassen Sie Thread B, bevor er WaitHandle.Set() aufruft, einige Daten in eine Warteschlange oder ähnliches stellen. Wenn dann Thread A "aktiviert" wird, kann er diese Daten aus der Warteschlange abrufen und mit der Ausführung der Objektmethode unter Verwendung dieser Daten fortfahren. Verwenden Sie einen Sperrmechanismus (d.h. die C#-Sperranweisung), um den Zugriff auf die Warteschlange zu synchronisieren.