2011-08-13 6 views
0

은 내가 멀티 스레드 애플리케이션을 설계 경험이 제한되어, 다음과 같은 간단한 문제에 대한 몇 가지 일반적인 조언을 기대했다 :멀티 스레드 디자인

응용 프로그램은 네트워크 장치의 모음과 통신한다. 정기적 인 간격으로 필요할 때마다 각 장치에서 유지 관리 작업을 수행해야합니다. 이전에는 각 장치에서 순차적으로 메서드를 호출하여이 작업을 수행했습니다. 그러나 이제는 시간이 너무 오래 걸리므로 각 장치의 메서드를 비동기 적으로 호출하도록 수정해야합니다.

처음에는 각 장치에 대한 메서드를 비동기 적으로 호출하고 메서드가 완료되었음을 나타내는 변수를 콜백으로 설정해야하며 그 동안에는 해당 변수가 모두 해당 메서드를 나타낼 때까지 반복합니다 완료되면 전체 프로세스가 완료 될 수 있습니다.

참고 : 저는 C#에서 프로그래밍 중입니다. 나는 등 높은 수준의 지식 만 ThreadStart, ThreadPool이의 약간의 경험을 가지고

+1

.Net의 버전은 무엇입니까? – svick

+0

정말 비동기 동작을 찾고 있습니까, 아니면 동시에 모든 장치를 동시에 \ 병렬로 작동하도록 하시겠습니까? –

+0

.NET 3.5 사용. 문제는 속도가 빠르며 한 번에 하나씩 장치에서 작동하는 데 너무 오래 걸립니다. 장치는 정확히 동시에 작동해야 할 필요는 없습니다. 비동기/병렬/동시라는 용어가 여기서 가장 잘 적용되는지는 확실하지 않습니다. 감사합니다. – Ronnie

답변

0

작업 수, 작업 잠금 및 종료 플래그를 사용할 수 있습니다. 종료하려면 :

  1. 작업 잠금을 확보하십시오.
  2. 작업 수가 0이면 종료하십시오.
  3. 종료 플래그를 설정하십시오.
  4. 잠금 장치를 해제하십시오.

    1. 획득 작업 잠금 :

  5. 는 작업을 할당합니다.
  6. 작업 수를 증가시킵니다.
  7. 잠금 장치를 해제하십시오. 작업을 완료

:

  1. 이 작업이
  2. 감소시킵니다 작업의 수를 고정 취득.
  3. 카운트가 0이 아닌 경우 잠금을 해제하고 돌아옵니다.
  4. 종료 플래그가 해제되어 있으면 잠금을 해제하고 돌아 오십시오.
  5. 종료. 받아들이는,

    1) 고전 Thread 클래스 : 스레딩 코드에 영향을 미치는 방법은 멀티 프로세서 머신 대 한에 후드 행동 않는 방법으로 너무 많이 파고없이

1

, 당신은 몇 가지 대안을 가지고 대의원이 그 임무를 수행한다. 상태 업데이트가 반드시 필요하지 않은 긴 작업에 적합합니다.

2) BackgroundWorkers을 사용하면 상태 이벤트가 노출 될 수 있습니다. 그들은 .NET ThreadPool이

3) 당신은 작업 완료시 실행하기 위해 .NET 스레드 풀 스레드에서의 작업을 실행하고 콜백을 지정할 수 있습니다 BeginInvoke, 자신 만하여 대표를 호출 할 수 있습니다를 사용

4) 당신은 새로운 & 좋은 Task Parallel Library을 사용할 수 있습니다, 당신에게 당신이

그 작업이 "병렬"를 실행하고자하는 경우 어떤 상태를 공유 기억 매우 우아한 패션에 필요한 모든 것을 제공합니다, 당신은 사용하여 해당 액세스를 직렬화해야한다 lock 문 (요구 사항에 따라 다른 메서드가 있음) 교착 상태에주의하십시오!