2011-03-07 6 views
2

아주 복잡한 질문 일 수 있습니다.다중 스레드 프로그램 - 설계 고려 사항

1) 내 애플리케이션을 재 설계하여 다중 스레드 (백그라운드 관리자는 정확함)와 작업 할 수있게되었습니다. 특정 GUI에 대해 5 또는 6 bgw를 사용하고있을 것입니다. 내 첫 번째 문제는, 내가 GUI를 자사의 "핵심"데이터를 얻을 필요가 하나의 메서드 호출이 있습니다. 이 데이터의 여러 부분은 코어 데이터와 동일한 페이지에 표시되는 데이터를 형성하는 여러 다른 장소 호출에 사용됩니다. backgroundworker1이 코어 데이터를 얻고, backgroundworker2가 코어의 특정 항목을 사용하여 더 많은 데이터를 얻고, backgroundworker3이 핵심 데이터를 사용하는 등 다양한 백그라운드 작업자와 어떻게 처리 할 수 ​​있습니까? 따라서 내 gui 및 주 스레드를 잠금 해제 상태로 두십시오.

2) 앞서 말했듯이 GUI는 중요한 데이터의 나머지 부분을 얻기 위해 핵심 데이터 집합을 먼저 가져온 다음 소수의 다른 데이터베이스 호출을 가져야합니다. gui 생성자 외부에서이 데이터를 가져와야하므로 GUI가 생성 될 때 이러한 큰 요구가 발생하지 않습니다. 디자인 감각으로, 어떻게하면 내 GUI를 구성하여 데이터에 대한 액세스 권한을 갖게되고, 생성 된 데이터에 액세스하여 액세스하고 표시 할 필요가 있습니까?

나는 이것들이 너무 말로만하는 질문이 아니길 바란다. 나는 이것의 많은 것이 초심자가 확실히 difficuly 인 프로그램 디자인에 내린다는 것을 이미 볼 수있다 (당연히 나의 의견으로는). 바라건대 누군가이 상황에서 내가 무엇을 할 것인지에 관해서 조언 해 줄 수 있습니다.

감사

+2

을 형성한다? 설명 할 때 소프트웨어가 ** 동기식 ** 및 ** 순차적 ** 인 것으로 보입니다. 예를 들어 gui가 요청을 보내고 응답을 기다리고 더 많은 요청을 보내면됩니다. 멀티 스레딩은 어디서 오는가? 여러 고객이 데이터 서버와 대화하고 있습니까? 어떤 경우 멀티 스레딩은 잠금 오버 헤드가 있기 때문에 속도를 늦출 수 있습니다. – davka

답변

1

이는 작업 큐에 대한 좋은 작업처럼 들린다. 이 기본 개념은 작업 항목을 대기열에 추가하는 것이며이 작업 항목에는 데이터 작업을 수행하는 연관된 기능이 있습니다. 일반적으로 작업은 지정한 수의 스레드에 분산됩니다.

이들 중 몇 가지가 존재합니다.

0

.net 4 작업 병렬 라이브러리를 살펴 보셨습니까? Task Parallel Library
페이지의 거의 중간에서 작업 계속 만들기라는 영역을 확인하십시오.

이 예는 링크 된 사이트

Task<byte[]> getData = new Task<byte[]>(() => GetFileData()); 
Task<double[]> analyzeData = getData.ContinueWith(x => Analyze(x.Result)); 
Task<string> reportData = analyzeData.ContinueWith(y => Summarize(y.Result)); 
getData.Start(); 

System.IO.File.WriteAllText(@"C:\reportFolder\report.txt", reportData.Result); 

// 또는 ... 당신은 멀티 스레드가는 것을 얻는가

Task<string> reportData2 = Task.Factory.StartNew(() => GetFileData()) 
             .ContinueWith((x) => Analyze(x.Result)) 
             .ContinueWith((y) => Summarize(y.Result)); 

System.IO.File.WriteAllText(@"C:\reportFolder\report.txt", reportData.Result); 
관련 문제