2010-12-08 9 views
4

私はwpf UIで作業するためにリアクティブエクステンションを使用していますが、基本的に私は両方ともサンプリングとスロットリングを行う必要があります(入力中にいくつかのものを連続して実行し、 (200〜300ミリ秒)リアクティブエクステンション、ロック、スレッド

問題は、予測できないことがあり、すぐにスロットルをトリガーすることがあります。これは、TextUpdatedイベントが観測可能なものや観察可能なものを持つものにしなかったためです。私も干渉するかもしれないいくつかのロックを行っているが、それは通常は新しいタスクを通して行われ、UIスレッドでは行われない。ブレークポイントを設定すると、デバッグが「間違って」より多くトリガーされるようなので、デバッグが動作に影響を与える可能性があります。

observableはUIスレッドで作成されるため(おそらく誤って)、タイマーなどそのスレッドの下にも、オブザーバブルを作成するための新しいスレッドを作成して、UIオーバーヘッドと潜在的なロックによって干渉されないようにするのは良い考えですか?どのようにして最良の方法でそのようなスレッドを設定すればよいのでしょうか?それは最後の空のwhileループがそんなに良い考えではないかもしれないと思います:)

とにかくスレッドはボンネットの下で動作しますか?あなたはそれが動作するキーに強打場合は、繰り返し起動する前に、500ミリ秒の遅延がありますようですキーを押したままP:

EDIT

はこの問題は、私はそれをテストしていた方法だったようです良い。一口

+0

(Sample/Throttleによる暗黙的な使用以外の)ThreadPoolを頻繁に使用していますか? –

答えて

1

SampleThrottleの両方のタイミングはScheduler.ThreadPoolですので、それは問題ではないでしょうか。

私は、ボトルネックがどこにあるか見つけるためにコードにいくつかのログを追加することをお勧めします:ここで

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

LogIntervalの定義です:

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(); 
    } 
} 

ボトルネックがスロットル/サンプルの場合は、おそらく、他の場所でThreadPoolを飽和状態にしていることを意味します。そのような場合、これらのスロットルのパフォーマンスが重要な場合は、専用スレッド+ディスパッチャを作成し、スロットル/サンプルにカスタムDistpatcherSchedulerを使用することを検討してください。あるいは、それを解決するためのより良いTPLの方法があるかもしれません。

+0

問題は、単なるwpfのテキストボックスである単純化されたバージョンと、textchanged observableに接続された2つの異なる反応拡張子がうまく機能することです。それは、アプリケーションの負荷が増加したときに問題が始まるようです。並列拡張を使用しているので、スレッドプールや反応拡張のために何かが飽和している可能性がありますか? – Homde

+0

ボトルネックを追跡するための更新を参照してください。はい、ThreadPoolを大量に使用している場合は、リソースが不足している可能性があります。 –

関連する問題