Если вы не делаете это самостоятельно, использование Метода 1) не вводит многопоточность. Вызов действия (если вы не вызываете BeginInvoke
) делает это синхронно, как и любой обычный вызов метода.
Я бы защищал метод 2). Нет необходимости привязывать его к одному потребителю. Если вы используете эту очередь в качестве единой точки контакта между камерами X и процессорами Y, вы отсоедините камеры от процессоров и сможете независимо изменять значения X и Y.
EDIT
Рискуя быть обвиненным в спаме в блоге, я вспомнил, что написал компонент, который похож (если не точно соответствует) на то, что вы ищете некоторое время назад. Посмотрите, поможет ли это:
ProcessQueue
Суть в том, что вы предоставляете очереди делегата, который может обработать один элемент - в вашем случае, Image
- в конструкторе, а затем вызовите Start
. Когда элементы добавляются в очередь с помощью Enqueue
, они автоматически отправляются в соответствующий поток и обрабатываются.
Например, если вы хотите, чтобы изображение двигалось Camera-> Processor-> Writer (и имело переменное число каждого), то я бы сделал что-то вроде этого:
ProcessQueue<Foo> processorQueue = new ProcessQueue<Foo>(f => WriteFoo(f));
ProcessQueue<Image> cameraQueue = new ProcessQueue<Image>(i => processorQueue.Enqueue(ProcessImage(i)));
Вы можете изменить число потоков в cameraQueue
(который контролирует обработку изображений) и processorQueue
(который контролирует запись на диск), используя SetThreadCount
.
Как только вы это сделаете, вы просто позвоните cameraQueue.Enqueue(image)
, когда камера сделает снимок.