在循环中清理一个数据表,将使用过的项移动到另外两个数据表中
本文关键字:数据表 移动 两个 循环 一个 | 更新日期: 2023-09-27 17:53:42
我有一个主DataTable
称为dtMain
和两个子数据表dtSuccess
和dtFail
。在每次迭代有10秒延迟的while循环中,dtMain
中的一些项将被添加到dtSuccess
和dtFail
中。因此,在每次迭代中,我希望我的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的访问。