РЕДАКТИРОВАТЬ: Проблема не была связана с вопросом. Это действительно было что-то не так с моим кодом, и на самом деле он был настолько простым, что я не хотел выкладывать его в Интернет. Спасибо, в любом случае.
Я прочитал примерно 550 тыс. записей Active Directory и сохранил их в списке, причем класс представляет собой простую оболочку для пользователя AD. Затем я разделил список ADRecords на четыре списка, каждый из которых содержал четверть от общего числа. После этого я прочитал около 400 тыс. записей из базы данных, известной как записи EDR, в таблицу данных. Я беру четыре четверти своего списка и создаю четыре потока, передавая каждую из четырех четвертей. Мне нужно сопоставить записи AD с записями EDR с помощью электронной почты прямо сейчас, но мы планируем добавить больше вещей для сопоставления позже.
У меня есть foreach в списке записей AD, и внутри этого я должен запустить цикл for для записей EDR, чтобы проверить каждую, потому что, если запись AD соответствует более чем одной записи EDR, то это не прямое соответствие и не должно рассматриваться как прямое соответствие.
Моя проблема заключается в том, что к тому времени, когда я доберусь до этого foreach в списке, в моем списке ADRecords будет всего около 130 записей, но сразу после того, как я их всех введу, я Console.WriteLine подсчитываю, и это 544k.
Я начинаю думать, что даже если я не установил для списка значение null, которое будет собрано позже, C# или Windows или что-то на самом деле забирают мой список, чтобы освободить место для записей EDR, потому что я не использовал список в пока. База данных, которую я должен использовать для чтения записей EDR, представляет собой связанный сервер, поэтому чтение их всех занимает около 10 минут, поэтому мой список фактически простаивает в течение 10 минут, но он никогда не устанавливается равным нулю.
Любые идеи?
//splitting list and passing in values to threads.
List<ADRecord> adRecords = GetAllADRecords();
for (int i = 0; i < adRecords.Count/4; i++)
{
firstQuarter.Add(adRecords[i]);
}
for (int i = adRecords.Count/4; i < adRecords.Count/2; i++)
{
secondQuarter.Add(adRecords[i]);
}
for (int i = adRecords.Count/2; i < (adRecords.Count/4)*3; i++)
{
thirdQuarter.Add(adRecords[i]);
}
for (int i = (adRecords.Count/4)*3; i < adRecords.Count; i++)
{
fourthQuarter.Add(adRecords[i]);
}
DataTable edrRecordsTable = GetAllEDRRecords();
DataRow[] edrRecords = edrRecordsTable.Select("Email_Address is not null and Email_Address <> ''", "Email_Address");
Dictionary<string, int> letterPlaces = FindLetterPlaces(edrRecords);
Thread one = new Thread(delegate() { ProcessMatches(firstQuarter, edrRecords, letterPlaces); });
Thread two = new Thread(delegate() { ProcessMatches(secondQuarter, edrRecords, letterPlaces); });
Thread three = new Thread(delegate() { ProcessMatches(thirdQuarter, edrRecords, letterPlaces); });
Thread four = new Thread(delegate() { ProcessMatches(fourthQuarter, edrRecords, letterPlaces); });
one.Start();
two.Start();
three.Start();
four.Start();
В ProcessMatches есть foreach в списке переданных ADRecords. Первая строка в foreach — это AdRecordsProcessed++; который является глобальным статическим целым числом, и программа завершается с ним на 130 вместо 544 КБ.