Tae*_*hin 11 c# concurrent-collections
我基本上是在寻找从线程中的相机获取的图像集合的容器.由于ConcurrentQueue是线程安全的,我想使用它.但在调试我的代码时,我发现这篇文章说
如果元素很小,你可能永远不会注意到这一点.但是,如果元素保留了大量资源(例如,每个元素都是一个巨大的图像位图),那么您可能会看到这种影响(一种解决方法是对包装器对象进行排队,例如,有一个
ConcurrentQueue<StrongBox<T>>而不是一个ConcurrentQueue<T>,并且为null在包装器出队后,包装器对T值的引用).
据我所知,StrongBox是一种原始价值的包装.这是否意味着我必须存储另一个图像集合?
所以我正在寻找一个用法或一个例子ConcurrentQueue<StrongBox<T>>.我从谷歌找到的唯一的东西是这个代码.
提醒过早优化的危险在评论中,所以我将解决这里发生的事情的语义.
就像文章指出的那样,ConcurrentQueue可以坚持已经经历过的一些事情的参考.我把它学到了"几打",文章说它不超过31,这看起来很漂亮.如果队列正在跟踪大对象,例如2000x2000位图,理论上这可能会成为一个问题.当然,这取决于你的程序的其余部分.
将它包装在一个StrongBox<T>帮助中是因为唯一StrongBox能做的就是保持对其他东西的引用.因此,a StrongBox具有非常小的占用空间,无论它保持什么都将超出范围并且(理论上)更快地获得GC.
既然StrongBox有饮食苏打的所有内容,你有点过分思考它的用法.你真的只是Value用一些加载字段,T然后再引用它.看起来有点像这样:
var boxedBitmap = new StrongBox<Bitmap>(new Bitmap(1,1));
var bitmap = boxedBitmap.Value;
Run Code Online (Sandbox Code Playgroud)
或者:
var boxedBitmap = new StrongBox<Bitmap>();
boxedBitmap.Value = new Bitmap(1,1);
var bitmap = boxedBitmap.Value;
Run Code Online (Sandbox Code Playgroud)
说真的,如果你在Reflector中打开它,这个类的实现就像5行.
在这种情况下,您的使用与使用时ConcurrentQueue<T>没有任何不同ConcurrentQueue<StrongBox<T>>.在将.Value资源发送到目标线程之前,您只需要处理.这确实帮助了我工作的公司通过简单地传递对确定性工具的引用而不是通过整个工具来减少大规模多线程分析服务的内存印记,但是你的里程可能会有所不同 - 我不清楚如果你传递的东西要被改变然后被其他东西使用,它将会产生什么影响.
| 归档时间: |
|
| 查看次数: |
2239 次 |
| 最近记录: |