Отсутствующие изменения в словаре

Я работаю над приложением 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? Решит ли это проблему пропущенных записей?

0 ответов

Другие вопросы по тегам