我已經使用BlockingCollection實現了生產者/消費者模式,但它並沒有像我期望的那樣被阻塞。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,告訴我我拉的框架正在其他地方使用。
img http://i17.photobucket.com/albums/b52/orubap/2012-03-24_020858.png
它並不總是馬上發生,但我已經注意到了這一點,只有當隊列爲空或接近空(即消費者比生產者更快),所以我猜這是發生與添加的第一張圖片或拍攝的最後一張圖片有關。任何想法,爲什麼這可能會發生?
好吧,看來你*是*在兩個地方使用圖像。一個是收集的消費者,另一個是事件處理程序。這很可能是你的問題。 'BlockingCollection'不知道你可能做的其他事情,它不會幫助你做到這一點。 – svick 2012-03-24 03:42:10