2011-02-17 2 views
5

많은 양의 Task 인스턴스를 만들었습니다. 나는 그들 모두를 실행해야하고, 그들 모두가 끝날 때까지 기다려야한다. 문제는 주어진 시간에 X 작업이 "시작"과 "완료"사이에 있는지 확인해야한다는 것입니다. 작업에는 동시 통화 수에 제한이있는 다른 당사자에 대한 통화가 포함됩니다. 이러한 제한은 내 하드웨어를 기반으로하지 않기 때문에 인텔리전트 스로틀 링에 의존하지 않습니다. 한계를 엄격히 집행해야합니다. 스레드가 안전한 방법으로 공유 변수를 증가 및 감소시키는 작업을 수행함으로써이 작업을 수행 할 수 있었지만, 불필요하게 번거로운 것으로 보입니다. API에 직접 내장 된 방법이 있습니까? 아니면 누락 된 동기화 도구가 있습니까?많은 .NET Task 인스턴스를 조정하는 가장 좋은 방법은 무엇입니까?

+1

세마포어는 훌륭한 해결책입니다. –

답변

4

당신은 How to: Create a Task Scheduler That Limits the Degree of Concurrency

편집을 참조 자신의 작업 스케줄러를 만들 필요가 : 이것은 세마포어보다 더 많은 코드를 필요로하지만 스레드 풀이하는 작업이 실행되기 때문에 나는이 더 잘 수행 할 수 있다는 느낌이 당신의 세마포어를 모르지만, TaskScheduler를 사용하는 것은 그들의 규칙에 따라 놀고 있습니다.

편집 2 : 세마포어를 사용 가능 단점의 하나는 스레드 풀은 당신의 작업이 IO 작업을하고 있다고 생각하고 (한 번에 많이을 예약 할 수 있습니다 그들이 거기에 걸 그들이 '돈 때문에, 잠깐 있도록 t CPU 필요). TaskScheduler를 사용하면 작업 스케줄러가있을 때 정확하게 스케줄됩니다. 확실히 수영장 청소기를 유지합니다.

1

세마포어 클래스는 당신을 위해 작동 할 수 있습니다 : http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

사용 방법을 보여이 MSDN 페이지에 좋은 예입니다.

같은 목적을 달성하는 데 사용할 수있는 더 가벼운 기본 제공 스레드 풀링/동기화 메커니즘이있을 수 있지만 세마포는 기본적으로 사용자가 요구하는 것을 수행하도록 설계되었습니다.

+1

.net 4.0 및 Semaphore에 대해 이야기하는 경우 SemaphoreSlim을 살펴 보는 것이 좋습니다. http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx – Andrey

관련 문제