遍历ConcurrentQueue时修改元素属性不生效的问题求助
遍历ConcurrentQueue时修改元素属性不生效的问题求助
各位大佬好,我最近遇到一个非常困惑的问题,想请大家帮忙分析下:
我正在处理一个复杂的对象结构,其中有一个ConcurrentQueue<SimpleProduct>类型的集合,我需要给队列里的SimpleProduct对象的Any字段赋值,但赋值后这个字段始终是null,完全没生效。
先给大家看下我的对象结构(已简化):
核心类定义
public class RefundBasics { public InvoiceDetail Invoice { get; set; } // 其他属性... } public class InvoiceDetail { public SaveSaleRecord.SaveSaleRequest sale { get; set; } // 其他属性... } public class SaveSaleRequest { public Customer Customer { get; set; } public ConcurrentQueue<SimpleProduct> Items { get; set; } // 其他属性... } public class SimpleProduct { public object Any { get; set; } // 其他属性... }
我的处理代码
我通过下面的方法来处理这个队列:
// 调用方式 ReplenishStockOnRefundedItems(Refund, replenish_location, user, apikey, saveChanges); // 其中Refund是RefundBasics类型的对象 internal static void ReplenishStockOnRefundedItems(RefundBasics Refund, string replenish_location, int user, string apikey, bool doit) { foreach (SimpleProduct item in Refund.Invoice.sale.Items) { // 跳过不需要处理的项 if (!item.PickPhysicalProduct || item.Quantity <= 0) continue; string replenish_location_id = ""; // 这里有具体的逻辑计算replenish_location_id的值,确认能得到正确的字符串 // 尝试给当前item的Any属性赋值 item.Any = replenish_location_id; } }
问题现象
- 预期结果:遍历完成后,符合条件的
SimpleProduct对象的Any属性应该被设置为计算好的replenish_location_id,后续代码可以正常读取这个值。 - 实际结果:不管怎么赋值,
Item.Any始终是默认的null,赋值操作完全没生效。
我自己的排查思路
- 一开始怀疑是
ConcurrentQueue的问题?但我理解ConcurrentQueue是线程安全的容器,这种遍历修改元素属性的操作应该是支持的吧?毕竟我只是修改元素本身的属性,不是修改队列的结构。 - 之前我用Linq的
.Where过滤出符合条件的项再循环,以为是Linq生成了新的对象实例导致修改失效,后来改成用continue跳过不符合条件的项,结果还是一样,应该不是实例的问题? - 补充说明:我已经确认代码确实走到了赋值那一行,没有被
continue跳过;另外这个场景其实不需要并发,但SaveSaleRequest是项目里通用的对象,其他业务场景需要用ConcurrentQueue,所以这里才沿用了这个类型。难道我必须先把队列转成List修改完再转回去吗?但总觉得没必要,是不是我哪里理解错了?
麻烦各位大佬帮忙看看问题出在哪里,谢谢了!
备注:内容来源于stack exchange,提问作者Jamie Hartnoll
相关产品推荐
相关产品推荐

