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
}
をウェブカメラからフレームを受信し、BlockingCollection
に追加するスレッドを1つ持っているし、別のスレッドで、私はコレクションへの参照を持っていると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
それはいつもすぐに発生しませんが、私は、キューが空または空の近くにあるときにのみ発生気づいた(すなわち。消費者が生産者よりも高速である)ので、私はそれをだ推測しています追加された最初の画像または最後に撮影された画像と関係があります。これがなぜ起こっているのでしょうか?
さて、あなたは* 2つの場所で画像を使用しているようです。 1つはコレクションのコンシューマーにあり、もう1つはイベントハンドラーです。それはおそらくあなたの問題です。 'BlockingCollection'はあなたがやっている可能性のあることを知らないので、これであなたを助けません。 – svick