Отсутствующие изменения в словаре
Я работаю над приложением WFP, которое содержит динамическую сетку в зависимости от типа заказа. Поэтому я привязал сетку к Dictionary<string, object>
,
Однако на одном экране, где я разрешаю пользователям вставлять новые заказы, я заметил, что иногда не все значения сохраняются, как правило, когда они вставляются в большом количестве, например, 500 строк. Я подозреваю, что это потому, что я использую словарь, а не ConcurrentDictionary
так что не все пишет в Dictionary
сохраняются.
Объект заказа:
public interface IOrder : IDictionary<string, object>,
{
IOrderDataDictionary<string, object> OrderData { get; set; }
}
OrderDataDictionary
public class OrderDataDictionary<TKey, TValue> : IOrderDataDictionary<TKey, TValue>
{
private static readonly ILog Log = LogManager.GetLogger(typeof(OrderDataDictionary<TKey, TValue>));
private readonly IDictionary<TKey, TValue> _innerDictionary;
#region Constructors
public OrderDataDictionary()
{
_innerDictionary = new Dictionary<TKey, TValue>();
}
public OrderDataDictionary(int capacity)
{
_innerDictionary = new Dictionary<TKey, TValue>(capacity);
}
public OrderDataDictionary(IDictionary<TKey, TValue> dictionary)
{
_innerDictionary = new Dictionary<TKey, TValue>(dictionary);
}
...
}
Добавление в словарь:
public Order ParseRows(List<string> rawRow, OrderType orderType)
{
Order order = GenerateOrderEntryRow(orderType);
List<string> row = rawRow.Select(x => x.ToString()).ToList();
foreach (BulkEntryColumnConfig column in _pasteHeader[orderType])
{
if (!column.IncludeInRequest || !column.AutoParse)
continue;
string rawVal = row[column.Index];
if (column.DataType == typeof (string))
{
Log.DebugFormat("{0}:{1}", column.Name, rawVal);
order.OrderData[column.Name] = rawVal;
}
}
...
return order;
}
порядок
public Order()
{
_innerDictionary = new OrderDataDictionary<string, object>();
OrderData = _innerDictionary;
}
public Order(IDictionary<string, object> dictionary)
{
_innerDictionary = new OrderDataDictionary<string, object>(dictionary);
OrderData = _innerDictionary;
}
GenerateOrderEntryRow()
public Order GenerateOrderRow(OrderType orderType)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
foreach (KeyValuePair<string, string> col in _columnDefinition[orderType])
{
dict.Add(col.Key, null);
}
dict["OrderType"] = orderType.ToString();
Order row = new Order(dict);
return row;
}
Вызов ParseRows()
return Task<IList<Order>>.Factory.StartNew(() => {...ParseRows()...}
Ключевая линия order.OrderData[column.Name] = rawVal;
где я добавляю значение в словарь, используя индексатор.
Я никогда не звоню Order()
что будет означать потенциальное изменение размера основного словаря позже. Я только называю Order (словарь IDictionary) из GenerateOrderEntryRow()
так что нет, если это не вызывается где-то еще неявно.
У меня вопрос, почему не все значения хранятся правильно, и я должен изменить Order.OrderData
быть типом ConcurrentDictionary
? Решит ли это проблему пропущенных записей?