แก้ไข: ปัญหาไม่เกี่ยวข้องกับคำถาม มันมีบางอย่างผิดปกติกับโค้ดของฉันจริงๆ และจริงๆ แล้ว มันง่ายมากจนฉันไม่อยากเอามันไปไว้บนอินเทอร์เน็ต ขอบคุณนะ
ฉันอ่านบันทึก Active Directory ประมาณ 550,000 รายการและจัดเก็บไว้ในรายการ ซึ่งเป็นคลาสที่ห่อหุ้มอย่างง่ายสำหรับผู้ใช้ AD จากนั้น ฉันแบ่งรายการ ADRecords ออกเป็นสี่รายการ โดยแต่ละรายการมีหนึ่งในสี่ของทั้งหมด หลังจากที่ฉันทำสิ่งนี้ ฉันจะอ่านบันทึกประมาณ 400,000 รายการจากฐานข้อมูลที่เรียกว่าบันทึก EDR ลงใน DataTable ฉันเอาสี่ในสี่ของรายการของฉันและวางไข่สี่เธรดโดยผ่านแต่ละหนึ่งในสี่ในสี่ ฉันต้องจับคู่บันทึก AD กับบันทึก EDR โดยใช้อีเมลในขณะนี้ แต่เราวางแผนที่จะเพิ่มสิ่งต่างๆ เพื่อจับคู่ในภายหลัง
ฉันมี foreach ในรายการบันทึก AD และภายในนั้น ฉันต้องเรียกใช้ for loop บนบันทึก EDR เพื่อตรวจสอบแต่ละรายการ เพราะหากบันทึก AD ตรงกับบันทึก EDR มากกว่าหนึ่งรายการ นั่นไม่ใช่ การจับคู่โดยตรง และไม่ควรถือว่าเป็นการจับคู่โดยตรง
ปัญหาของฉัน เมื่อมาถึงหน้าหน้านี้ในรายการ ADRecords ของฉันมีเพียงประมาณ 130 รายการเท่านั้น แต่หลังจากที่ฉันดึงทั้งหมดเข้ามา ฉัน Console.WriteLine นับจำนวน และมันคือ 544k
ฉันเริ่มคิดว่าแม้ว่าฉันจะไม่ได้ตั้งค่ารายการเป็นโมฆะเพื่อรวบรวมในภายหลัง แต่ 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++; ซึ่งเป็น int แบบคงที่ทั่วโลก และโปรแกรมจบที่ 130 แทนที่จะเป็น 544k