我基本上是在寻找一个从线程中的相机获取的图像集合的容器。由于ConcurrentQueue是线程安全的,所以我想使用它。但是在调试我的代码时,我发现本文 http://blogs.msdn.com/b/pfxteam/archive/2012/05/08/concurrentqueue-lt-t-gt-holding-on-to-a-few-dequeued-elements.aspx saying
如果元素很小,您可能永远不会注意到这一点。如果,
然而,这些元素占用大量资源(例如,每个元素都是
一个巨大的图像位图),你可能会看到它的影响
(一种解决方法是将包装对象排队,例如有一个ConcurrentQueue<StrongBox<T>>
而不是一个ConcurrentQueue<T>
, 和
在包装器完成后,将包装器对 T 值的引用清空
已出队)。
据我所知,StrongBox
是原始值的一种包装。这是否意味着我必须存储另一组图像?
所以我正在寻找用法或示例ConcurrentQueue<StrongBox<T>>.
我从谷歌唯一发现的是
评论中提醒了过早优化的危险,因此我将解决这里发生的事情的语义。
正如文章指出的那样,ConcurrentQueue
可以保留一些已经经历过的事情的参考。我学的是“几十个”,文章说不超过 31 个,这似乎很好地结合在一起。如果队列正在跟踪大对象,例如 2000x2000 位图,理论上这可能会成为问题。当然,这取决于程序的其余部分正在做什么。
将其包裹在一个StrongBox<T> http://msdn.microsoft.com/en-us/library/bb549038.aspx有帮助,因为唯一的事情StrongBox
所做的就是保留对其他事物的引用。因此,一个StrongBox
占用空间非常小,无论它包含什么,都会超出范围并且(理论上)更快地被 GC 处理。
Since StrongBox
含有无糖汽水的所有成分,你有点想太多了它的用途。你实际上只是加载Value
领域与一些T
然后稍后再参考。它看起来有点像这样:
var boxedBitmap = new StrongBox<Bitmap>(new Bitmap(1,1));
var bitmap = boxedBitmap.Value;
或者:
var boxedBitmap = new StrongBox<Bitmap>();
boxedBitmap.Value = new Bitmap(1,1);
var bitmap = boxedBitmap.Value;
说真的,如果你在 Reflector 中打开这个类,它的实现大约只有 5 行。
在这种情况下,您的使用ConcurrentQueue<T>
与使用实际上没有什么不同ConcurrentQueue<StrongBox<T>>
。你只需添加.Value
在将资源发送到其目标线程之前。这确实帮助我工作的公司通过简单地传递对确定性工具的引用而不是传递整个工具来减少大量多线程分析服务的内存印记,但你的里程可能会有所不同 - 我不清楚如果你传递一些东西来变异然后被其他东西使用,会产生什么后果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)