编辑:问题与问题无关。我的代码确实存在问题,实际上,它是如此简单,以至于我不想将其发布到互联网上。不管怎么说,还是要谢谢你。

我读了大约550k Active Directory记录并将它们存储在List中,该类是AD用户的简单包装。然后,我将ADRecords列表分为四个列表,每个列表占总数的四分之一。完成此操作后,我从一个称为EDR记录的数据库中读取了约40万条记录到DataTable中。我使用列表的四分之四,并生成四个线程,并通过四个四分之一。我现在必须使用电子邮件将AD记录与EDR记录进行匹配,但我们计划在以后添加更多内容以进行匹配。

我在AD记录列表上有一个foreach,在其中,我必须在EDR记录上运行for循环以检查每个记录,因为如果AD记录与多个EDR记录匹配,则不是直接匹配,因此不应将其视为直接匹配。

我的问题是,当我到达列表上的这个foreach时,我的ADRecords列表中仅包含约130条记录,但是在将它们全部拉入后,我立即用Console.WriteLine计数,即544k。

我开始认为,即使我没有将列表设置为null以后再收集,但C#或Windows或其他方法实际上正在删除我的列表以为EDR记录腾出空间,因为我没有在而。我用来读取EDR记录的数据库是一台链接服务器,因此读取它们大约需要10分钟,因此我的列表实际上闲置了10分钟,但从未设置为null。

有任何想法吗?

//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中,传入的ADRecord列表上有一个foreach。foreach的第一行是AdRecordsProcessed ++;这是一个全局静态int,程序在130(而不是544k)处将其完成。

最佳答案

该变量永远不会设置为null,并且仍然在范围内吗?如果是这样,则不应该收集它,空闲时间也不是您的问题。

我看到的第一个问题是:

AdRecordsProcessed++;


您是否在更新之前锁定了该全局变量?如果没有,并且取决于记录的处理速度,它将低于您的预期。

尝试从一个线程运行它(即,传递adRecords而不是firstQuarter,并且不要启动其他线程。)它是否可以按预期的方式在1个线程中工作?

10-08 06:40