2011-02-24 3 views
1

Silverlight/C#에서 렌더러를 만들었습니다. 현재 System.Threading.ThreadPool을 사용하여 타일 렌더링을 병렬로 예약합니다. 지금은 잘 작동하지만 사용되는 스레드 수를 제한하고 싶습니다. 내가 ThreadPool.SetMaxThreads를 호출 할 경우스레드 수가 최대 인 Silverlight 용 스레드 풀이 있습니까?

  • 응용 프로그램이 as documented 충돌이 실버 라이트에서 실행되므로

    은 제한이 몇있다. (차라리하지 않는 게 좋을)

  • 내 자신의 스레드 풀을 구현 OSS/타사 스레드 풀을 찾기

    • :
    • 내가 몇 가지 옵션을 볼 수없는 작업 병렬 라이브러리

    없다

어떤 테스트 다른 스레드가 있습니까 (나는 다른 장소에서 할)

  • 사용 수신 Silverlight와 함께 작동하는 풀은 있습니까?

    아니면 제한된 수의 스레드를 생성하고 이들에 대기열 작업을하는 Rx 표현식을 제안 할 수 있습니까?

  • +0

    왜 스레드 수를 변경하려고합니까? 스레드 풀을 사용하려면 작업을 오랜 시간 실행하지 않아야합니다. 따라서 사실상 코어의 수를 고려하여 이미 효율적으로 설정되어 있어야합니다. wpf 응용 프로그램에서 코드를 시험해 보았고 설정 한 번호로 응용 프로그램이 더 효율적으로 작동하는지 확인 했습니까? –

    +0

    WPF 응용 프로그램을 테스트하지 않았으므로 더 효율적이라고 확신하지 못합니다. 나는 이것이 더 효율적인지를보기 위해 이것을 시험해보고 싶다. 그리고 모든 동기화 문제를 디버깅하고 이해하기 위해 이것을 할 수 있기를 바란다. –

    +0

    멀티 스레드 응용 프로그램을 디버그하기가 어렵고 프로그램이 중단 점에 도달하여 일시 정지하면 많은 동기화 문제가 발생하지 않을 것이라고 생각합니다.이 작업을 수행하려면 프로파일 러가 필요합니다. 보세요 [이] (http://stackoverflow.com/questions/2222826/profiling-net-thread-contention) –

    답변

    0

    Ami Bar의 SmartThreadPool을 확인하십시오. 그것은 기본 닷넷 스레드 풀에서 부족한 기능을 가지고 있으며, 스레드 풀 인스턴스 당 MaxThreads 속성을 설정하고 실버 라이트를 지원합니다.

    1

    이 수신을 사용하는 경우, 체크 아웃 : https://github.com/xpaulbettsx/ReactiveUI/blob/master/ReactiveUI/ObservableAsyncMRUCache.cs

    이 (당신의 응용 프로그램에이 하나 개의 파일을 복사하는 것은 매우 쉬워야한다, 단지 this.Log() 라인과 IEnableLogger 인터페이스를 핵무기)

    , 단지 CachedSelectMany에 SelectMany를 아주 쉽게 변경됩니다를 사용하여 :

    someArray.ToObservable() 
        .CachedSelectMany(webService) 
        .Subscribe(x => /* do stuff */); 
    
    1

    Rx를 사용한다면 IScheduler를 직접 구현할 수있을 것 같습니다. 이것은 단순한 세마포어를 적용한 다음 작업을 ThreadPool에 전달할 수 있습니다. 이 접근법을 사용하면 ThreadPool을 활용할 수 있고 인터페이스에 대해 코딩하는 동안 테스트 할 수 있으며 테스트를위한 좋은 솔기가 생깁니다.

    더 자세히 살펴보면이 글을 직접 작성 했으므로 ThreadPool 기아를 피할 수 있도록 스레드 풀 대신 자신을 관리하는 작은 스레드 (< 10) 세트를 실제로 사용할 수 있습니다.