Я реализовал шаблон Producer/Consumer, используя BlockingCollection, однако он, похоже, не блокируется, как я ожидаю.
У меня есть один поток, получающий кадры с веб-камеры и добавляющий их в BlockingCollection.
private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) {
image = (Bitmap)eventArgs.Frame.Clone();
queue.Add(image);
if (NewFrame != null)
NewFrame(this, new NewFrameEventArgs(image)); //invoke the event for display
}
И в другом потоке у меня есть ссылка на коллекцию и обработка кадров с помощью
public void Run() {
foreach (Bitmap bmp in queue.GetConsumingEnumerable()) {
// process bitmap
Однако, как вы можете видеть ниже, он имеет тенденцию вызывать исключение InvalidOperationException, говорящее мне, что кадр, который я извлекаю, используется где-то еще.
http://i17.photobucket.com/albums/b52/orubap/2012-03-24_020858.png
Это не всегда происходит сразу, но я заметил, что это происходит только тогда, когда очередь пуста или почти пуста (т.е. потребитель быстрее, чем производитель), поэтому я предполагаю, что это как-то связано с первым добавленным изображением или последнее сделанное изображение. Любые идеи, почему это может происходить?
BlockingCollection
ничего не знает о других вещах, которыми вы можете заниматься, и это вам не поможет. - person svick   schedule 24.03.2012