2013-12-09 3 views
0

처음부터 시작하기 :작업 공장 힘 이상의 작업 내가이 같은 작업 뭔가 (의사)와 작업 공장 작성하고

private int _taskcounter; 

싹둑

var factory = new TaskFactory(); 
for(var i = 0;i<1000;i++) 
    factory.StartNew(() => doWork()); 

싹둑를

private void doWork(){ 
    Interlocked.Increment(ref _taskcounter); 
    //do some slow I/O work here 
    Interlocked.Decrement(ref _taskcounter); 
} 

이제는 _taskcounter를 보시면
이 처음 10 개 작업을 시작합니다. 하지만 대기열이 완료 될 때까지 1 ~ 2 작업/초를 시작합니다.

사소한 명백한 동작입니까, 아니요?

제 질문은 :
강제로 작업 공장이 시작시 더 많은 작업을 시작하도록하는 방법이 있습니까?

이미 과도한 메모리 소비를 방지하기 위해 일부 msdn 예제 클래스의 변형으로 실행중인 작업의 최대 값을 제한합니다.
또는이 재미있는 측정 방법이나 나의 고려 사항에 문제가 있습니까?

다른 스레드에서 모든 작업을 수행 할 필요가 없습니다. 공장을 사용할 필요가 없습니다.
저는 공장의 비 작동 도용 동작의 이점만 원합니다.

다른 모든 것들은 공장의 인텔리전스에 의존합니다.

+0

왜 여러 작업을 한 번에 정확하게 시작 하시겠습니까? 그들이 뭐하고 있니? 여러 번 병렬로 작업하면 프로세스 속도가 빨라 집니까? – svick

+0

확실히 그럴 것입니다. 필자는 이미 느린 TCP io 작업이라고 말했습니다. io 태스크는 하드웨어/네트워크 리소스가 응답하기를 99 % 기다리고 있으므로 프로세스를 병렬 처리하는 동안 속도 때문에 큰 영향을 미칩니다. –

답변

1

TaskFactory가 ThreadPool을 사용하는 것으로 알고 있으므로 SetMaxThreads 메소드를 시도 할 수 있습니다. 그러나 실제로는 자원 소비를 최적화하도록 설계되었습니다. 그래서 나는 당신이 많은 효율성 증가를 얻을 것이라고 생각하지 않습니다.

또한 수동으로 new Thread()으로 스레드를 시작하려고 할 수 있습니다. 많은 스레드를 시작하는 데 도움이 될 것입니다.하지만 시간이 많이 걸릴 것이라고 생각하지 않습니다.

+0

taskfactory는해야 할 일을 정확하게 수행하고 있지만 대량의 대기열을 실행하는 경우 최대 효율에 도달하려면 10 분 이상이 소요됩니다. 나는이 과정을 빠르게하고 싶다. –

+0

나는 그것을 말하지 않았다. 최적화 메커니즘으로 인해 최대 10 분 후에 만 ​​도달합니다. 프로그래머가 많은 짧은 작업이나 긴 또는 많은 긴 작업을 기다리는 것을 알지 못합니다. 값을 안다면'SetMinThreads'를 사용해보십시오. MSDN에서는 TP가이 스레드 수를 즉시 생성 할 것이라고 말합니다. – Tony

+0

아님 시도해주세요. 좋은 소리. Theadpool이 최대치에 미치지 못한다. 메모리가 오버 플로우 될 때까지 작업/스레드를 생성합니다. 당신이 예상했던 것만 큼 똑똑하지 않다. –