循环运行缓慢

本文关键字:缓慢 运行 循环 | 更新日期: 2023-09-27 18:26:23

我有一个Web Method,它正在查询Outlook以从Global Address List获取所有通讯组列表。

这将获取4000多个分发列表,这正是我希望它做的,但当它进入循环将4000个列表传递到我的List时,它需要3分钟以上才能完成for循环。有人能看到任何不同寻常的事情吗?有人能回答为什么会发生这种情况吗?

这是我的代码:

        public class DistributionListDetails
        {
            public int DistributionListId { get; set; }
            public string DistributionListEmail { get; set; }
        }
        List<DistributionListDetails> distributionLists = new List<DistributionListDetails>();
        int val = 0;
        //create Outlook application. 
        Outlook.Application oApp = new Outlook.Application();
        //get Mapi NameSpace and Logon. 
        Outlook.NameSpace oNS = oApp.GetNamespace("mapi");
        //get Global Address List. 
        Outlook.AddressLists oDLs = oNS.AddressLists;
        Outlook.AddressList oGal = oDLs["Global Address List"];
        //get a specific distribution list. 
        string sDL = "TestDL";
        Outlook.AddressEntries oEntries = oGal.AddressEntries;
        Outlook.AddressEntry oDL = oEntries[sDL];
        if (oDL.Manager != null)
        distributionLists.Add(new DistributionListDetails
            {
                DistributionListId = val,
                DistributionListEmail = oDL.Manager.ToString()
            });
        //get all of the members of the distribution list. 
        oEntries = oDL.Members;
        Outlook.AddressEntry oEntry = default(Outlook.AddressEntry);
        int i = 0;
        for (i = 1; i <= oGal.AddressEntries.Count && i <= 10; i++)
        {
            oEntry = oGal.AddressEntries[i];
            distributionLists.Add(new DistributionListDetails
            {
                DistributionListId = val,
                DistributionListEmail = oEntry.Name
            });
        }

注意:我通过AJAX将循环中返回的列表绑定到下拉列表中。

循环运行缓慢

假设对AD的查询不是瓶颈,请尝试使用此LINQ来确定大小。它将替换您的最后一个循环。

distributionLists.AddRange(oGal.AddressEntries
  .Cast<Outlook.AddressEntry>()
  .Select(
    x => new DistributionListDetails 
    { 
        DistributionListId = val, 
        DiestributionListEmail = x.Name
    }));

编辑:强制将AddressEntries转换为IQueryable,这样选择就可以了。

我猜每次有人调用此方法时,您都会运行此方法来获取分发列表。与其这样做,不如缓存分发列表,并在需要时从缓存中访问它们。

  1. 为通讯组列表创建存储库类
  2. 当用户第一次调用此方法时,加载使用您的方法从outlook获取存储库。然后将其存储在MemoryCache。您必须选择一个合适的缓存策略。例如,如果,您需要每小时刷新缓存的通讯组列表必须使用绝对过期时间并将其设置为1小时。如果没有,你可以使用滑动过期,延长缓存的使用寿命对象
  3. 您的存储库应该首先检查缓存的对象是否可用,如果是,请使用它。否则,请使用上面的方法再次加载它方法