2014-01-17 2 views
1

이 질문은 특히 다중 스레드 및 재귀를 사용하여 트리를 만드는 것과 관련이 있습니다. 재귀를 사용하여 트리를 만드는 코드가 실행되고 있지만 그 트리를 만드는 데 필요한 시간이 내가 쓰고 싶은 것 이상입니다.다중 스레드 및 재귀를 사용하여 트리 만들기

느린 이유는 Ektron CMS에서 TaxonomyManager를 호출하기 때문에 약간의 시간이 걸리고 모든 호출이 빠르게 추가되기 때문입니다. 멀티 스레딩을 사용하여 트리를 만드는 방법이 있는지 궁금합니다.

(현재 코드가 없지만 해당 코드에 액세스하는 즉시 해당 코드를 추가합니다.)

트리를 손상시키는 내 루트가 루트 노드이고 멀티 스레딩이 특정 시점에서 해당 노드에 해당 노드를 추가하는 경우이 경로로 이동하십시오.

아무도 들어 주셔서 감사합니다.

편집 : 코드가 추가되었습니다. TaxonomyNodes는 클래스에 많은 속성이 없습니다. ID, 이름, 설명, 경로 (Ektron과 비슷한 방식으로 경로 저장), HasChildren 플래그, ParentId 및 Public List Children을가집니다.

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

@stackoverflow.com/questions/how-to-ask – sh1rts

+0

@ G.Stoynev 나는 읽지 않는다. 확실히 Ektron CMS를 알고 있지만 프레임 워크를 가지고 있으며 분류 체계에 대한 정보를 제공하는 클래스가 있습니다. Ektron에 대해 알지 못한다고 생각한다면 유감스럽게 생각합니다. TaxonomyManager m = 새 TaxonomyManager(); 목록 td = m.GetList (<목록을 가져올 조건>); –

답변

1

가 작동 할 수 있지만, 공식적으로는 Ektron의 API에서 지원되지 않으며 다른 도전을 제시 할 수있다, 멀티 스레딩, 들어가기보다는, 내가 필요로하지 않는 데이터에 대한 캐싱 또는 다른 스토리지의 형태를 추천 할 것입니다 재귀 DB 호출.

옵션 :

1 -는 Ektron의 분류 API를 재귀 적으로가 아니라 하나의 API 호출로 수준 및 하위 항목의 지정된 수까지, 전체 트리를 당길 수있는 GetTree 방법을 포함 할. 이것은 더 잘 수행 될 수 있으며 쉽게 캐시 될 수 있습니다.

2 -는 Ektron은 쉽게에

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

을 변경하여 Web.config의에서 사용할 수 있습니다 API 레벨 캐싱을 제공합니다

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

3 - eSync 전략을 사용하는 출력합니다 필요한 모든 데이터를 Ektron 's에 저장하는 것보다 유선형 객체를 사용하는 것이 XML 파일과 같은 것입니다. 이 샘플을 보려면 http://developer.ektron.com/Templates/CodeLibraryDetail.aspx?id=1989&blogid=116을 작성하십시오. DB 동기화 완료 이벤트에 후크하여 전체 Taxonomy 구조를 XML 파일에 기록하는 콘솔 응용 프로그램을 트리거합니다.