为什么我的对象没有在 ConcurrentQueue 的 For 循环中更新

问题描述 投票:0回答:0

我有一个非常复杂的对象,正在处理它的各种代码。其中有一个简单的“产品”对象列表,我想向“任何”字段添加一个值。

“根”对象看起来像这样(简化):

public class RefundBasics
    {
        public InvoiceDetail Invoice { get; set; }
        // more....
    }

InvoiceDetail
看起来像:

public class InvoiceDetail
    {
        public SaveSaleRecord.SaveSaleRequest sale { get; set; }
        // more....
    }

SaveSaleRequest
看起来像:

    public class SaveSaleRequest 
    {
        public Customer Customer { get; set; }
        public ConcurrentQueue<SimpleProduct> Items { get; set; }
        // more....
    }

我遇到麻烦的关键对象是上面的

ConcurrentQueue<SimpleProduct> Items

所以我有一些简单的代码被调用:

 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 = "";
            // Some code to determine the value of replenish_location_id 

            // Now store replenish_location_id on this item in the ConcurrentQueue
            item.Any = replenish_location_id;          
        } 
    }

我期待发生的事情:

循环我所有的项目并将

replenish_location_id
分配给项目的
Any
属性后,我可以稍后在我的代码中使用它。

实际发生的事情:

Item.Any
始终为空(默认值),该值未分配给属性。

任何想法为什么......?我在想这可能是因为它是一个

ConcurrentQueue
,但是,那是回到前面?并发对象在这种循环中应该是线程安全的并且更可靠?这就是它的理解方式以及我在这里使用它们的原因。

我也有一次在我的循环之前有一个

Linq
.Where
而不是
continue
某些项目不适用的声明,认为这可能会创建一组新的对象并因此丢失实例,但改变它上面的代码没有任何区别,所以我很确定这不是一个实例问题——除非我误解了什么。

编辑-以下问题:

SimpleProduct
是一个类,看起来像这样:

public class SimpleProduct
{
    public object Any { get; set; }
    // more properties...
}

是的,我确定代码在

if
语句之后执行。

并发不是实际上这个特定代码部分所必需的,但由于

SaveSaleRequest
是我代码中的常用对象,它是其他事情所必需的,因此项目列表因此是并发队列。我 could 之前将它转换为列表,然后在运行此代码时再次转换回来,但我认为我不必这样做 - 除非我想念某些东西?

c# for-loop concurrency instance
© www.soinside.com 2019 - 2024. All rights reserved.