2014-01-17 28 views
1

這個問題具體涉及使用多線程和遞歸創建樹。 我已經得到了將使用遞歸創建樹的代碼運行,但創建該樹所需的時間超過了我想要花費的時間。使用多線程和遞歸創建樹

緩慢的原因是因爲我在Ektron CMS中調用了TaxonomyManager,它需要一點點時間才能返回,所有的調用都快速加起來。我想知道是否有方法使用多線程創建樹。

(我目前沒有這個代碼,但是當我訪問該代碼時我會盡快添加該代碼)。

如果我走這條路線,我會破壞樹的機會是什麼,因爲樹是一個根節點,多線程將在某個點將這些節點添加到該節點。

感謝任何人的任何輸入。

編輯:添加代碼。 TaxonomyNodes是我的類沒有很多屬性。有Id,Name,Description,Path(以Ektron類似的方式存儲路徑),HasChildren標誌,ParentId和公共列表子項。

public List<TaxonomyNodes> CreateTree() 
    { 
     try 
     { 

      TaxonomyManager tManager = new TaxonomyManager(); 
      TaxonomyCriteria criteria = new TaxonomyCriteria(); 
      criteria.AddFilter(TaxonomyProperty.ParentId, CriteriaFilterOperator.EqualTo, 0); 
      criteria.OrderByDirection = EkEnumeration.OrderByDirection.Ascending; 
      criteria.OrderByField = TaxonomyProperty.Id; 

      List<TaxonomyData> tDataList = tManager.GetList(criteria); 

      int index = 0; 
      if (tDataList != null) 
      { 
       foreach (TaxonomyData item in tDataList) 
       { 
        if (item.Name != "Companies" && item.Name != "Content Information Centers") 
         root.Insert(index++, new TaxonomyNodes() { ParentId = 0, TaxonomyId = item.Id, TaxonomyDescription = item.Description, TaxonomyName = item.Name, TaxonomyPath = item.Path, HasChildren = item.HasChildren, Children = new List<TaxonomyNodes>() }); 
       } 
      } 
      index = 0; 
      foreach (TaxonomyNodes itemT in root) 
      { 
       itemT.Children = CreateNodes(itemT.TaxonomyId, itemT); 
      } 

      return root; 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

    private List<TaxonomyNodes> CreateNodes(long taxonomyId, TaxonomyNodes itemToAddTo) 
    { 
     try 
     { 
      TaxonomyManager tManager = new TaxonomyManager(); 
      TaxonomyCriteria criteria = new TaxonomyCriteria(); 
      criteria.AddFilter(TaxonomyProperty.ParentId, CriteriaFilterOperator.EqualTo, taxonomyId); 
      criteria.OrderByDirection = EkEnumeration.OrderByDirection.Ascending; 
      criteria.OrderByField = TaxonomyProperty.Id; 

      List<TaxonomyData> tDataList = tManager.GetList(criteria); 

      List<TaxonomyNodes> node = new List<TaxonomyNodes>(); 
      if (tDataList != null) 
      { 
       foreach (TaxonomyData item in tDataList) 
       { 

        node.Add(new TaxonomyNodes() { ParentId = taxonomyId, Children = null, TaxonomyId = item.Id, TaxonomyDescription = item.Description, TaxonomyName = item.Name, TaxonomyPath = item.Path, HasChildren = item.HasChildren }); 

        itemToAddTo.Children = node; 
        if (item.HasChildren) 
        { 
         CreateNodes(item.Id, node[node.Count - 1]); 

        } 
        else 
        { 
         return node; 
        } 
       } 
      } 

      return node; 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
+0

出於好奇,你如何「調用TaxonomyManager」? (我沒有downvote - 這是一個很好的問題,我認爲 - 尤其是如果您稍後添加代碼) –

+0

請閱讀 - http://stackoverflow.com/questions/how-to-ask – sh1rts

+0

@ G.Stoynev我不是當然,如果你知道Ektron CMS,但他們有一個框架,並且包含一個能夠提供有關分類的信息的類。如果我認爲你不瞭解Ektron,並且如果你這樣做,我很抱歉。 TaxonomyManager m = new TaxonomyManager(); List td = m.GetList(<將獲取列表的條件>); –

回答

1

而不是進入多線程,這雖然可以工作,沒有正式曄的API支持,可能會出現其他的挑戰,我會推薦一些形式的緩存或其它儲存不需要的數據遞歸數據庫調用。

選項:

1 - 曄分類法的API做包括GetTree方法,它可以拉動整個喬木,高達水平,和子項指定數目的一個API調用,而不是遞歸。這可能表現更好,並且可以輕鬆緩存。

2 - 曄提供API級緩存可以在web.config通過改變

<framework defaultContainer="Default" childContainer="BusinessObjects" /> 

爲了容易啓用:

<framework defaultContainer="Cache" childContainer="BusinessObjects" /> 

3 - 使用ESYNC策略將輸出的您需要的數據(最好使用自己的流線型對象,而不是將Ektron的所有額外數據存儲到XML文件中)。看到這個樣本,http://developer.ektron.com/Templates/CodeLibraryDetail.aspx?id=1989&blogid=116,我寫了這樣做的事情。它掛鉤到數據庫同步完成事件並觸發一個控制檯應用程序,它將整個分類結構寫入一個XML文件。