我们有一个绑定到一个List<T>
项目的网格。每当用户点击“刷新”时,都会从数据库中获取更改,并更新绑定列表。我遇到了重复项目被添加到网格中的问题,我不知道为什么。
数据库调用返回两个值:aList<int>
已更改的记录 ID,以及已更改List<MyClass>
记录的更新数据。我正在调试的现有代码代码找出需要更新的内容如下所示:
public void FindUpdates(IList<MyClass> existingRecords,
IList<MyClass> updatedRecords,
List<int> updatedIds,
out IDictionary<int, int> existing,
out IDictionary<int, int> updated,
out List<int> updates,
out List<int> removes,
out List<int> adds)
{
updates = new List<int>();
removes = new List<int>();
adds = new List<int>();
existing = FindUpdated(existingRecords, updatedIds);
updated = FindUpdated(updatedRecords, updatedIds);
if (updatedIds != null)
{
// split add/update and remove
foreach (int id in updatedIds)
{
if (!existing.ContainsKey(id))
adds.Add(id);
else if (updated.ContainsKey(id))
updates.Add(id);
else
removes.Add(id);
}
WriteToLog(updatedIds, adds, updates, removes);
}
}
private IDictionary<int, int> FindUpdated(IList<MyClass> records, List<int> updatedIds)
{
IDictionary<int, int> foundItems = new Dictionary<int, int>();
if (records != null && updatedIds != null)
{
for (int i = 0; i < records.Count; i++)
{
IMyClass r = records[i] as IMyClass ;
if (r != null && !r.IsDisposed)
{
if (updatedIds.Contains(r.Id))
{
foundItems.Add(r.Id, i);
}
}
}
}
return foundItems;
}
调用的结果FindUpdates()
是我得到一个Dictionary<Id, Data>
现有记录,一个Dictionary<Id, Data>
更新的记录来替换它们,以及一个List<int>
应该从数据源中添加、删除或更新项目的 Id。
有时,一条记录会两次添加到网格中,我终生无法弄清楚这段代码哪里出错了。
我从其中一个实例中提取了日志文件,并且可以清楚地看到以下事件序列:
- 项目 #2 添加到数据列表
- 20 分钟后,第 2 项再次添加到数据列表中
WriteToLog()
从第二个添加告诉我
updatedIds
包含值 1、2 和 3adds
包含 1 和 2updates
包含 3
根据其他日志条目,我可以清楚地看到第 2 项是之前添加的,并且从未删除过,因此它应该在existingRecords
变量中已显示在updates
变量中,而不是在adds
. 此外,项目#2 在第一次添加和第二次添加之间成功更新了几次,所以理论上代码应该可以工作。我还有一个 UI 的屏幕截图,并在数据网格中显示了项目 #2 的两个副本。
笔记...
IsDisposed
仅在.Dispose()
项目的覆盖方法中设置为 true。我认为这不会发生。编辑:从那时起,我添加了一条日志语句,并且可以验证发生这种情况时
IsDisposed
未设置为true
。这种情况现在已经在几个不同的用户身上发生过几次,所以这不仅仅是一次性的事情。我无法按需重现问题。
记录网格可能相当大,平均有几千个项目。
我没有排除 DB 调用返回无效值的想法,或者没有相同项目的列表,但是我不知道这会如何影响结果
有一次我能够看到这个错误,我们正在运行一些测试,其他用户相当频繁地修改记录#2
这一切都在后台线程中运行
根据日志,这一次只运行一次。它在一分钟前运行,然后在 2 分钟后运行。
从日志文件中,我可以看到第 2 项在第二次错误添加之前已正确更新了几次,因此此代码之前确实与现有数据集一起工作过几次。
上面显示的代码中是否有任何内容可能导致这种情况发生?或者也许是 C# 中一个罕见的已知问题,我不知道会发生这种情况?