2010-12-08 3 views
4

반응 형 확장 기능을 사용하여 wpf UI와 작업 할 수 있습니다. 기본적으로 샘플링과 스로틀 작업을 모두 수행해야하는 텍스트 상자가 있습니다. 작은 timespans (200-300 밀리 초)Reactive Extensions, Locks and Thread

문제는 다소 예측할 수 없으며 때로는 스로틀을 즉시 트리거합니다. 이는 TextUpdated 이벤트가 관찰 가능 항목 또는 관찰 항목 자체가있는 항목으로 변경되지 않았기 때문일 수 있습니다. 나는 또한 간섭을 일으킬 수있는 잠금을 수행하고 있지만 이는 일반적으로 UI 스레드가 아니라 새 작업을 통해 수행됩니다. 또한 중단 점을 설정할 때 디버깅이 "잘못"되는 것 같아서 디버깅이 동작에 영향을 미칠 수 있습니다.

관측 가능 대상이 UI 스레드에서 생성되었으므로 (아마도 실수로) 타이머 또는 무엇이든 사용합니다. 그 스레드 아래에있는 경우 관측 가능 항목을 만들기위한 새 스레드를 만들어 UI 오버 헤드와 잠재적 인 잠금에 간섭받지 않도록하는 것이 좋습니다. 가장 좋은 방법으로 그런 스레드를 어떻게 설정합니까? 끝나면 비어있는 while-loop가 좋은 생각이 아닐 수도 있습니다. :)

스로틀, 샘플 작업 및 리 액티브 확장은 다음과 어떤 관계가 있습니까? 스레드는 어쨌든 두건에서 작동합니까? 편집

문제가 내가 그것을 테스트 한 방법이었다 보인다 : 당신이 키를 누르고 있으면 P는 그것이 반복이 시작되기 전에 그냥 작동 키에 쾅 경우 500 밀리 초 지연이있을 것 같다 벌금. 한숨

+0

(Sample/Throttle을 통한 암묵적인 사용을 제외하고) ThreadPool을 많이 사용하고 있습니까? –

답변

1

모두 SampleThrottle은 타이밍이 맞지 않으므로 Scheduler.ThreadPool을 사용하십시오. ,

public static class ObservableEx 
{ 
    public static IObservable<TSource> LogInterval(
     this IObservable<TSource> source, string message) 
    { 
     return source 
      .TimeInterval() 
      .Do(x => Debug.WriteLine("{0} :: {1} ({2})", 
       message, x.Value, x.Interval.TotalMilliseconds); 
      .RemoveTimeInteval(); 
    } 
} 

병목 스로틀/샘플의 경우 :

여기
sourceEvents.LogInterval("Source") 
    .Throttle(throttleTimeSpan).LogInterval("Throttled") 
    .Sample(sampleTimeSpan).LogInterval("Sample") 
    .Subscribe(); 

LogInterval의 정의입니다 :

나는 병목이 어디 있는지 찾기 위해 코드에 일부 로깅을 추가하는 것이 좋습니다 아마 다른 곳에서 ThreadPool을 포화 상태로 만드는 것을 의미합니다. 그렇다면이 스로틀의 성능이 중요합니다. 스로틀/샘플에 전용 스레드 + 디스패처를 만들고 사용자 정의 DistpatcherScheduler을 사용하는 것이 좋습니다. 또는 TPL 방식으로 문제를 해결할 수도 있습니다.

+0

문제는 단지 wpf 텍스트 상자와 두 개의 서로 다른 반응 확장이 textchanged observable에 연결되어있는 단순화 된 버전이 잘 작동한다는 것입니다. 앱의로드가 증가하면 문제가 시작되는 것입니다. 병렬 확장을 사용하고 있기 때문에 스레드 풀이나 무효화 된 확장 기능을 포화 시켰을 수도 있습니까? – Homde

+0

병목 현상을 추적하려면 업데이트를 참조하십시오. 예, ThreadPool을 많이 사용하는 경우에는 사용 가능한 리소스가 충분하지 않을 수 있습니다. –

관련 문제