2013-02-14 106 views
0

我試圖從SharePoint 2010中檢索同義詞,並且我的代碼存在以下問題:它通過沒有索引器的keywordCollection循環。做一個foreach需要很長的時間,因爲實例化一個新的關鍵字持續大約5-10ms,到目前爲止有大約8000個關鍵字,大約需要80秒才能完成。 事情,我試過到目前爲止:foreach循環在SharePoint 2010中花費太長時間

  • 獲得枚舉 - >需要80秒以及

  • 投集合到一個列表 - >失敗的原因未知。

代碼示例:

KeywordContext keywordContext = fastProxy.KeywordContext; 
SearchSettingGroupCollection searchSettingGroupCollection = keywordContext.SearchSettingGroups; 

foreach (SearchSettingGroup searchSettingGroup in searchSettingGroupCollection) 
{ 
    if (searchSettingGroup.Name == siteId.ToString()) 
    { 
     foreach (Keyword keyword in searchSettingGroup.Keywords) 
     { 
      //the rest of the work here, per total takes about 470ms 
     } 
    } 
} 

有通過不使用foreach語句的集合,其中一個新的object<T>每次實例化的方式來循環?

謝謝!此外

using (var site = new SPSite(siteCollectionUrl)) 
{ 
    // get the site ID 
    var guid = site.ID.ToString(); 

    // code to get the fastProxy FASTAdminProxy 

    KeywordContext keywordContext = fastProxy.KeywordContext; 
    var ssgs = keywordContext.SearchSettingGroups; 
    if (ssgs.ContainsSearchSettingGroup(guid)) 
    { 
     var searchSettingGroup = ssgs.GetSearchSettingGroup(guid); 
     foreach (var keyWord in searchSettingGroup.Keywords) 
     { 
      // do stuff with keyWord.Synonyms 
     } 
    } 
} 

,雖然我不能在此刻測試它,你可以嘗試使用Parallel類:

+0

「'//工作的休息這裏'「<----這是最相關的部分。你在循環中做什麼?如何讓索引器幫助你? – dasblinkenlight 2013-02-14 11:33:30

+0

//工作的其餘部分 - >只是一些字符串操作,每80秒總共需要470毫秒。問題是,每當foreach實例化一個新的只讀關鍵字,它需要10ms這是我的問題。 – 2013-02-14 12:07:48

+0

所以它不像你可以跳過大部分關鍵字,對吧?即它看起來像你的代碼需要訪問集合中的每個關鍵字,是否正確? – dasblinkenlight 2013-02-14 12:10:24

回答

0

試試這個

using System.Threading.Tasks; 

// ... 

Keyword[] array = new Keyword[searchSettingGroup.Keywords.Count]; 
searchSettingGroup.Keywords.CopyTo(array, 0); 
Parallel.ForEach<Keyword>(array, keyword => 
{ 
    //do stuff here 
}); 
+0

您在那裏做了什麼和我做了什麼沒有區別。我的問題是與foreach,幕後正在做類似(var關鍵字=新關鍵字blabla ....)實例化每個關鍵字10毫秒。 – 2013-02-14 12:09:36

+0

對於第二種方法,我已經嘗試了CopyTo,但它失敗了,而且我無法使用並行庫,因爲它使用.NET 3.5進行編譯。可悲的是,我將不得不處理它或找到另一種方法。 – 2013-02-14 14:30:29

+0

獲得枚舉數(應該與CopyTo相同,因爲他們需要創建一個集合中包含所有關鍵字的集合的新實例)花費了80秒,所以理論上即使它工作,也會花費80秒相同的大量時間將它們複製到一個字符串[] – 2013-02-14 14:32:31