I have a main DataTable called dtMain and two child DataTables dtSuccess and dtFail. In a while loop that has a 10 second delay in each iteration some items in dtMain will be added to dtSuccess and dtFail.
So in each iteration I would like my dtMain to be clean from everything that is in those other two lists.
I will put the code I have tried here but unfortunately it does not work.
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);
}
I have received Exceptions such as:
Collection was modified; enumeration operation might not execute
And InvalidOperationException
The source contains no DataRows
 
                        
Are you modifying the dtSuccess and dtFail datatables in another thread? You'll need to use a synchronization technique to only allow one thread in at a time.
To be honest, datatables aren't a very good mechanism for this. In fact, I rarely find datatables to be a good solution. One such solution might be to stop using the dtMain datatable, and convert it to a
ConcurrentQueue<DataRow>. Have your other thread(s) pull from the Queue, and the main thread can just check to see if TryPeek on the queue fails. Or use a ReaderWriter lock to synchronize access to dtMain.