在评论中提醒了过早优化的危险,所以我将在这里讨论发生的事情的语义。
就像文章指出的那样,ConcurrentQueue
可以保留一些已经经历过的事情的参考。我知道它是“几十个”,文章说它不超过 31 个,这似乎很好地凝结。如果队列正在跟踪大对象,例如 2000x2000 位图,理论上这可能会成为问题。当然,这取决于程序的其余部分在做什么。
将其包装在StrongBox<T>
帮助中,因为唯一要做的StrongBox
就是保持对其他事物的引用。因此,aStrongBox
的占用空间非常小,它所拥有的任何东西都将超出范围并且(理论上)更快地获得 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
在将资源发送到其目标线程之前,您只需执行此操作。这确实帮助我工作的一家公司通过简单地传递对确定性工具的引用而不是传递整个工具来减少大量多线程分析服务的内存印记,但你的里程可能会有所不同 - 我不清楚如果您传递要突变的东西然后被其他东西使用,将会产生什么后果。