我的应用程序从多个线程修改某些数据表。我已经实现了用于添加行并提交到数据库的独占锁定机制(2 个不同的线程正在处理它)。现在,UI 线程(第 3 个)使用此表通过 LINQ 缩小数据范围,然后将结果绑定到图表控件。我已经将其分成尽可能小的命令,以找出它发生的位置。
var s1 = dataTable.ToList(); //originally it was dataTable.ToEnumerable()
var s2 = s1.Select(LINQ_expr1);
var s3 = s2.Where(LINQ_expr2);
var s4 = s3.OrderBy(LINQ_expr3);
在所有情况下,它都发生在执行第一个命令时。我现在能想到的唯一 100% 有效的选择就是在此处包含我的锁定机制。我想避免它,所以也许有人知道这里的解决方案?我想它必须是创建此变量的副本并抵抗此异常的东西。
这个表可以有几十万行(它会定期被截断,但只有在分析之后才会被截断),这就是为什么我要求替代我的锁定解决方案。它会阻塞其他线程,但另一方面成本会低于 DataTable.Copy()。
以
ToList()
开头是没有意义的,因为以下 LINQ 方法确实处理 Enumerables。然而,可能有必要在最后调用 ToList()
,以便将图表控件与 DataTable 和 LINQ 查询分离。否则 DataTable 可能会重复执行整个查询。
在枚举 DataTable 时不允许修改它(使用
ToList()
或任何其他 LINQ 方法)。因此,请确保其他线程在执行查询时不会修改 DataTable。