В многопотоке делаю гет-запросы. Результат пихаю в список. Дальше в монопольном режиме хочу запихнуть данные в БД. Почему то lock не даёт монопольный доступ к InsertRowsToDB, так как у меня в БД дублируются данные.
var rows = new List<string>();
Object locker = new Object();
Parallel.For(0,urls.Count, new ParallelOptions { MaxDegreeOfParallelism = 100}, (i) =>
{
var data = GetRequest(urls[i]);
lock(locker)
{
rows.Add(data);
if (rows.Count>=100)
{
InsertRowsToDB(rows);
rows.Clear();
}
}
});
InsertRowsToDB, возможно он асинхронный. – aepot Oct 13 '20 at 05:23InsertRowsToDB(rows.ToList());- передавать копию списка, чтобы гарантировать, что она не будет модифицирована, пока идет запись. – aepot Oct 13 '20 at 05:31InsertRowsToDB– Геннадий П Oct 13 '20 at 06:21InsertRowsToDB(rows), иначе вы потеряете часть данных (до 99 записей). Приводите уж весь код, имеющий отношение к делу. – CrazyElf Oct 13 '20 at 06:57в многопотоке идут гет запросы для ускорениядля асинхронныйх вызовов не нужен многопоток, но они вполне могут выполняться одновременно. – aepot Oct 13 '20 at 08:12