Перечитав вопрос, я думаю, что теперь понимаю проблему. У вас есть что-то вроде этого:
class Producer
{
public Producer(ExternalSource src)
{
src.OnData += externalSource_OnData;
}
private void externalSource_OnData(object sender, ExternalSourceDataEventArgs e)
{
// put e.Data onto the queue
}
}
А потом у вас есть потребительский поток, который вытаскивает вещи из этой очереди. Проблема в том, что событие OnData вызывается вашим ExternalSource
объектом - в любом потоке, в котором он выполняется.
C # event
s - это, по сути, простая в использовании коллекция делегатов, а «запуск» события просто заставляет среду выполнения зацикливаться на всех делегатах и запускать их по одному.
Таким образом, ваш обработчик событий OnData вызывается в любом потоке, в котором работает ExternalSource
.