gpt4 book ai didi

c# - Parallel.ForEach 显然是克隆引用类型?

转载 作者:行者123 更新时间:2023-12-03 09:25:50 25 4
gpt4 key购买 nike

我有一个简单的方法:

private IEnumerable<OrderResult> SubmitOrders(IEnumerable<OrderItem> items)
{
ConcurrentBag<OrderResult> results = new ConcurrentBag<OrderResult>();

Parallel.ForEach(items, item =>
{
OrderResult result = SubmitOrder(item);
results.Add(result);
});

return results;
}

要添加更多上下文,上面引用的 SubmitOrder(item) 方法会更改 上的 Sent (DateTime?) 属性如果订单提交成功,则将 item 对象转换为 DateTime.Now

Parallel.ForEach 循环内,在 SubmitOrder(item) 之后,我可以看到 Sent 属性已正确更新。

但是,如果我检查传入的 items 参数中的对象,则 Sent 属性均未更新。就好像传递到 Parallel.ForEach 循环中的项目不是原始 items 集合中的项目。

这是为什么呢?如果传入集合中的对象在循环中被修改,我预计更改会反射(reflect)在原始集合中的项目中,但它们似乎没有。

最佳答案

items的参数类型是 IEnumerable<OrderItem> 。如果items尚未枚举,枚举它们会创建新对象,那么这可能就是原因,因为您在 SubmitOrder() 中更新的对象下次和对象不一样items被枚举。这是一个完整的 LINQPad C# 程序,它演示了我的意思。

void Main()
{
IEnumerable<OrderItem> itemsAsIEnumerable =
Enumerable
.Range(1, 5)
.Select(i => new OrderItem() { ItemNumber = i });
SubmitOrders(itemsAsIEnumerable);
itemsAsIEnumerable.Dump();
/* Displays:
ItemNumber Sent
1 null
2 null
3 null
4 null
5 null
*/

IEnumerable<OrderItem> itemsAsList =
Enumerable
.Range(1, 5)
.Select(i => new OrderItem() { ItemNumber = i })
.ToList();
SubmitOrders(itemsAsList);
itemsAsList.Dump();
/* Displays:
ItemNumber Sent
1 2/5/2014 10:01:58 AM
2 2/5/2014 10:01:58 AM
3 2/5/2014 10:01:58 AM
4 2/5/2014 10:01:58 AM
5 2/5/2014 10:01:58 AM
*/
}

private IEnumerable<OrderResult> SubmitOrders(IEnumerable<OrderItem> items)
{
ConcurrentBag<OrderResult> results = new ConcurrentBag<OrderResult>();

Parallel.ForEach(items, item =>
{
OrderResult result = SubmitOrder(item);
results.Add(result);
});

return results;
}

private OrderResult SubmitOrder(OrderItem item)
{
item.Sent = DateTime.Now;
return new OrderResult();
}

public class OrderItem
{
public int ItemNumber { get; set; }

public DateTime? Sent { get; set; }
}

public class OrderResult
{
}

关于c# - Parallel.ForEach 显然是克隆引用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21582766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com