首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BlockingCollection,竞争情况?

BlockingCollection,竞争情况?
EN

Stack Overflow用户
提问于 2012-03-24 10:35:29
回答 1查看 488关注 0票数 0

我已经使用BlockingCollection实现了一个生产者/消费者模式,但是它似乎并没有像我预期的那样阻塞。

我有一个线程从网络摄像头接收帧,并将它们添加到BlockingCollection

代码语言:javascript
复制
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
}

在另一个线程中,我拥有对集合的引用,并使用

代码语言:javascript
复制
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

它并不总是立即发生,但我注意到只有当队列为空或接近空时才会发生(即。消费者比生产者更快),所以我猜这与添加的第一张图片或拍摄的最后一张图片有关。你知道为什么会发生这种情况吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-24 11:30:40

当图像被传递给NewFrame事件处理程序时,执行video_NewFrame的线程正在使用该图像。由于它与Run并发运行,因此不会阻止这两个线程同时访问image。(只有当NewFrame事件处理程序正在处理图像时,Run将图像出队时,才会发生这种情况,这就解释了为什么只有在队列为空或几乎为空时才会看到图像。)

一种修复方法是将调用移到queue.Add(image);之前的NewFrame (在video_NewFrame中)。这将确保Run在事件处理程序处理完它之前看不到它(假设事件处理程序没有存储对它的引用)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9848668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档