EDIT: Masalah tidak ada hubungannya dengan pertanyaan. Memang ada yang salah dengan kode saya, dan sebenarnya sangat sederhana sehingga saya tidak ingin menaruhnya di internet. Terima kasih.
Saya membaca sekitar 550k catatan direktori aktif dan menyimpannya dalam Daftar, kelas menjadi pembungkus sederhana untuk pengguna AD. Saya kemudian membagi daftar ADRecords menjadi empat daftar, masing-masing berisi seperempat dari total. Setelah saya melakukan ini, saya membaca sekitar 400 ribu catatan dari database, yang dikenal sebagai catatan EDR, ke dalam DataTable. Saya mengambil empat perempat dari daftar saya dan menelurkan empat utas, melewati masing-masing dari empat perempat. Saya harus mencocokkan data AD dengan data EDR menggunakan email sekarang, namun kami berencana menambahkan lebih banyak hal untuk dicocokkan nanti.
Saya memiliki foreach pada daftar data AD, dan di dalamnya, saya harus menjalankan perulangan for pada data EDR untuk memeriksa masing-masing data, karena jika data AD cocok dengan lebih dari satu data EDR, maka itu bukan a pertandingan langsung, dan tidak boleh diperlakukan sebagai pertandingan langsung.
Masalah saya, pada saat saya masuk ke daftar ini, daftar ADRecords saya hanya memiliki sekitar 130 catatan di dalamnya, tetapi tepat setelah saya menarik semuanya, saya Console.WriteLine menghitungnya, dan jumlahnya 544k.
Saya mulai berpikir bahwa meskipun saya belum menyetel daftar ke null untuk dikumpulkan nanti, C# atau Windows atau sesuatu sebenarnya mengambil daftar saya untuk memberi ruang bagi catatan EDR karena saya belum menggunakan daftar itu di a ketika. Basis data yang harus saya gunakan untuk membaca catatan EDR adalah server tertaut, jadi dibutuhkan sekitar 10 menit untuk membaca semuanya, jadi daftar saya sebenarnya menganggur selama 10 menit, tetapi tidak pernah disetel ke nol.
Ada ide?
//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();
Di ProcessMatches, ada foreach pada Daftar ADRecords yang diteruskan. Baris pertama di foreach adalah AdRecordsProcessed++; yang merupakan int statis global, dan program berakhir pada 130, bukan 544k.