РЕДАКТИРОВАТЬ: Я думаю, что вы, вероятно, хотите использовать класс System.Threading.AutoResetEvent.В документации MSDN есть достойный пример того, как один поток ожидает другого, и я думаю, что он похож на то, что вы пытаетесь сделать: http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx В частности, обратите внимание на вызовы trigger.WaitOne () и trigger.Set ()
EDIT2: добавлена опция № 3 после чтения нового комментария из OP.
«Всякий раз, когда я вызываю методы объекта, работающего в потоке A ...» - объект не 't «запускается» в потоке и на самом деле не принадлежит ни одному потоку, независимо от того, в каком потоке был создан объект.
Учитывая, что ваш вопрос касается «межпотокового вызова без пользовательского интерфейса», я полагаюуже знакомы с "вызовом перекрестного потока пользовательского интерфейса".Я вижу, как WinForms может создать у вас впечатление, что поток владеет объектом, и вам необходимо «отправить сообщение» потоку, чтобы он что-то сделал.
Управляющие объекты WinForm являются своего родаособый случай в том, что они просто не работают должным образом, если вы взаимодействуете с ними с потоком, который не является тем, который их создал, но это не вызвано тем, как взаимодействуют потоки и объекты.
В любом случае,Перейдем к решению вашего вопроса.
Во-первых, вопрос, который прояснит проблему: вы упомянули, что делает Поток B, но что делает Поток A до того, как Поток B вызывается?
Вот несколько идей, которые, я думаю, соответствуют тому, что вы хотите сделать:
Не создавайте поток А, пока вам это не нужно.Вместо того, чтобы поток B «отправлял сообщение в поток A», лучше попросите поток B создать поток A (или назовите его потоком C, если хотите) и заставьте его начать выполняться в это время.
Если вам нужен поток A, который уже существует, и вы хотите, чтобы поток A обрабатывал только события потока B по одному, вы можете подождать, пока поток A не получит уведомление от потока BВзгляните на класс System.Threading.WaitHandle (интересующие производные классы - ManualResetEvent и AutoResetEvent).
Поток A в какой-то момент вызовет WaitHandle.WaitOne (), который будетзаставьте его остановиться и подождать, пока поток B не вызовет WaitHandle.Set () для того же объекта WaitHandle.
Если поток A занят другими делами, возможно, вы захотите настроить некоторые из них.вид переменной флага.Подобно концепции WaitHandle в # 2, но вместо того, чтобы заставлять поток A делать паузу, вы просто хотите, чтобы поток B установил флаг (возможно, просто логическую переменную), который будет сигнализировать потоку A, что ему нужно что-то делать.Пока поток А занят другими делами, он может периодически проверять этот флаг, чтобы решить, есть ли работа, которую нужно выполнить.
Выполняет ли метод, на котором будет выполняться поток А,Ваш объект требует какого-либо ввода из темы B?Затем, прежде чем поток B вызовет WaitHandle.Set (), пусть он поместит некоторые данные в очередь или что-то в этом роде.Затем, когда поток A «активирован», он может извлечь эти данные из очереди и приступить к выполнению метода объекта с использованием этих данных.Используйте механизм блокировки (например, оператор блокировки C #) для синхронизации доступа к очереди.