2010-12-29 2 views
2

저는 현재 작업하고있는 응용 프로그램을 가지고 있으며 현재 현재 상황을 보여줍니다. 좀 더 효율적으로 만드는 데 도움이 될지 궁금합니다. 작업 병렬 라이브러리 (Task Parallel Library)도 사용하려고합니다 (도움이되는 경우). 현재 상황을 설계하는 방식에 제한이 없습니다. 즉, 앱의 일부를 완전히 다시 디자인 할 수 있습니다. 그것은 모두 당신이 "효율성", 당신은 멀티 스레드 디자인을 유지하는 비용 대 해결하기 위해 시도하고있는 무슨 문제가 무엇을 의미하는지에 따라 달라집니다 어떤 도움다중 스레드 응용 프로그램으로 작성하는 방법에 대한 지침이 필요합니다.

답변

2

에 대한

class Program 
{ 
    static void Main(string[] args) 
    { 
     IList<ISystem> systems = GetSystems(); 
     if (systems.Where(s => s.Import = true).Count() == 0) 
      return; 

     var export = new Export(); 
     // Import & Export People 
     exportData.LoadPeople(); 
     foreach(var system in systems) 
      foreach(var person in export.People) 
       system.Push(person); 

     export.LoadLocations(); 

     foreach(var system in systems) 
      foreach(var location in export.Locations) 
       system.Push(location); 

     export.LoadOtherData(); 

     foreach(var system in systems) 
      system = system as IDifferentSystem; 
      if (system == null) continue; 
      foreach(var data in export.OtherData) 
       system.Push(data); 

    } 
} 

감사합니다. 당신은 장기 실행 작업이 호출 스레드를 차단하지 않으

  1. :

    몇 가지 매우 일반적인 대한 조언

    , 다중 스레드 디자인이 적절한 문제의 세 가지 유형이 있습니다. 이것은 아마도 GUI 응용 프로그램이 응답 성을 유지할 수 있도록 기본 GUI 스레드를 차단하고 싶지 않은 GUI 응용 프로그램에 더 적용 할 수 있습니다.

  2. 이 알고리즘은 데이터를 세분화하고 여러 코어에서 병렬로 알고리즘을 실행할 수있는 "당황스럽게 병렬"이라고합니다.
  3. 로컬 또는 원격 다른 프로세스와의 통신. 다른 프로세스는 물론 다른 스레드입니다.

위는 조금 이상 - 간단하지만 포인트는 선입견 솔루션으로 문제를 강제 반대로 당신이 바로 그 문제를 해결하고 있는지 확인한다. 멀티 스레드 디자인 사용을 결정할 때 고려해야 할 많은 요소. 자동화 된 테스트가 더욱 어려워 질 것입니다. 디자인이 실행의 정확성 (충돌/중단/데이터 손상 없음)과 특정 앱의 성능 정의로 유지 관리 될 수 있습니까? 물론 TPL은 멀티 스레드 설계를 더 쉽게 만들지 만 확실히 이러한 비용을 모두 제거하지는 않습니다.

항상 대안을 고려하십시오. 예를 들어 위의 # 1은 비동기식을 사용하여 수행 할 수도 있습니다. 나중에 I/O 콜백이 호출하는 스레드에서 실행됩니다 (내부적으로는 멀티 스레드이지만 사용자가 신경 쓰지 않아도됩니다). 이것은 여전히 ​​단일 스레드 설계이므로 걱정할 필요가 없습니다. 또한 # 2의 경우 성능을 높이기 위해보다 효율적인 알고리즘 및/또는 데이터 구조 레이아웃을 사용할 수도 있습니다.

관련 문제