在循环中清理一个数据表,将使用过的项移动到另外两个数据表中

本文关键字:数据表 移动 两个 循环 一个 | 更新日期: 2023-09-27 17:53:42

我有一个主DataTable称为dtMain和两个子数据表dtSuccessdtFail。在每次迭代有10秒延迟的while循环中,dtMain中的一些项将被添加到dtSuccessdtFail中。因此,在每次迭代中,我希望我的dtMain从其他两个列表中的所有内容中清除。

我会把我在这里尝试过的代码,但不幸的是它不起作用。

while (dtMain.Rows.Count > 0)
{
   var query = dt.AsEnumerable().Except(dtSuccess.AsEnumerable(), DataRowComparer.Default)
                 .AsEnumerable().Except(dtFail.AsEnumerable(), DataRowComparer.Default);
   if (dtMain.AsEnumerable().Any())
        dtMain = query.CopyToDataTable();
   Thread.SLeep(10000);
}

我收到异常,如:

Collection被修改;枚举操作可能无法执行

InvalidOperationException

源文件不包含datarow

在循环中清理一个数据表,将使用过的项移动到另外两个数据表中

尝试在变量上循环(这将解决您的集合修改问题):

int i = dtMain.Rows.Count ;
while ( i > 0)
{
   var query = dt.AsEnumerable().Except(dtSuccess.AsEnumerable(), DataRowComparer.Default)
                 .AsEnumerable().Except(dtFail.AsEnumerable(), DataRowComparer.Default);
   if (dtMain.AsEnumerable().Any())
        dtMain = query.CopyToDataTable();
   Thread.SLeep(10000);
   i = dtMain.Rows.Count ;
}

您是否在另一个线程中修改dtSuccess和dtFail数据表?您需要使用同步技术来一次只允许一个线程进入。

老实说,数据表并不是一个很好的机制。事实上,我很少发现数据表是一个好的解决方案。一种这样的解决方案可能是停止使用dtMain数据表,并将其转换为ConcurrentQueue<DataRow>。让其他线程从队列中取出,主线程可以检查队列上的TryPeek是否失败。或者使用ReaderWriter锁来同步对dtMain的访问。