我基本上是在寻找从一个线程中从相机获取的图像集合的容器。由于ConcurrentQueue是线程安全的,因此我想使用它。但是在调试代码时,我发现this article



据我所知,StrongBox是一种原始值的包装器。这是否意味着我必须存储图像的另一个集合?

所以我在寻找ConcurrentQueue<StrongBox<T>>.的用法或示例

最佳答案

注释中提到了过早优化的危险,因此,我将在这里讨论发生的事情的语义。

就像文章指出的那样,ConcurrentQueue可以保留对已经经历过的某些事情的引用。我学到的是“几十个”,而文章说不超过31个,这似乎很好地融合了。如果队列正在跟踪大型对象(例如2000x2000位图),那么从理论上讲可能会成为问题。当然,这取决于程序的其余部分在做什么。

将其包装在 StrongBox<T> 中会有所帮助,因为StrongBox唯一要做的就是保留对其他内容的引用。因此,StrongBox的占用空间非常小,并且所持有的任何内容都将超出范围,并且(理论上)可以使GC更快。

由于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即可。这确实帮助了我工作的一家公司,只需将引用传递给确定性工具,而不是传递整个工具,就可以大大降低大规模多线程分析服务的内存烙印,但是您的工作量可能会有所不同-我不清楚如果您要传递某些东西进行突变然后再被其他东西使用,将会产生什么样的后果。

关于c# - ConcurrentQueue <StrongBox <T >>的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13612098/

10-10 13:40