我正在开发一个 WFP 应用程序,该应用程序包含一个动态网格,具体取决于相关订单类型。因此,我已将网格绑定到Dictionary<string, object>
.
然而,在我允许用户粘贴新订单的一个屏幕上,我注意到有时并非所有值都被保留,通常是当他们粘贴大量数据时,比如 500 行。我怀疑这是因为我使用的是 Dictionary 而ConcurrentDictionary
不是所有的写入Dictionary
都被持久化。
订单对象:
public interface IOrder : IDictionary<string, object>,
{
IOrderDataDictionary<string, object> OrderData { get; set; }
}
订单数据字典
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;
}
生成OrderEntryRow()
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 dictionary) ,GenerateOrderEntryRow()
除非它在其他地方被隐式调用。
我的问题是,为什么不是所有值都正确存储,我应该修改Order.OrderData
为 typeConcurrentDictionary
吗?这会解决一些写入丢失的问题吗?