The parameter type of items
is IEnumerable<OrderItem>
. If items
hasn't been enumerated yet, and enumerating them creates new objects, then that could be the cause, as the objects you're updating in SubmitOrder()
are not the same as the objects the next time items
is enumerated. Here is a full LINQPad C# program that demonstrates what I mean.
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
{
}