13

.netObservableクラスを使用して単純な Observer パターンを実装しようとしています。次のようなコードがあります。

Observable.FromEventPattern<PropertyChangedEventArgs>(
    Instance.User,
    "PropertyChanged")
          .Where(e => e.EventArgs.PropertyName == "FirstName")
          .ObserveOn(Scheduler.ThreadPool)
          .Subscribe(search => OnFirstNameChanged(search.EventArgs));

Observable.FromEventPattern<PropertyChangedEventArgs>(
    Instance.User,
    "PropertyChanged")
          .Where(e => e.EventArgs.PropertyName == "LastName")
          .ObserveOn(Scheduler.ThreadPool)
          .Subscribe(search => OnLastNameChanged(search.EventArgs));

オブザーバーをバックグラウンド スレッドで実行したいのですが、すべてを同じバックグラウンド スレッドで実行したいと考えています (実際の実装では、すべてのリスナーを異なるスレッドで実行するのは複雑すぎます)。

つまりOnXXXChanged、UI スレッド以外のスレッドですべてのロジックを実行したいのですが、スレッドObservingプール全体ではなく、同じスレッドで正しい順序で実行されるようにしたいと考えています。

上記はどのように変更する必要がありますか?

また、多少関連するメモとして、Observableクラスを使用してこのパターンを実装する良いサンプル コード例はありますか?

4

2 に答える 2

19

EventLoopSchedulerを作成し、次のすべての呼び出しでその単一のインスタンスを使用する必要がありObserverOnます。

var scheduler = new EventLoopScheduler(ts => new Thread(ts));

... .ObserveOn(scheduler). ...

ファクトリ メソッドによって作成されたスレッドは、実行をスケジュールするために使用されるスレッドです。プロパティExitIfEmptyをこのスレッドに設定したままにしておくfalseと、何もすることがなくても終了しません。つまり、すべての呼び出しで再利用されます。

ただし、 の使用も検討できますScheduler.NewThread。そのスケジューラを使用すると、他に何もすることがない場合にスレッドを終了できます。より多くの作業がキューに入れられるObserverOnと、新しいスレッドが作成されますが、存在するスレッドは 1 つだけです。つまり、異なるオブザーバーを同期する必要はありません。

EventLoopSchedulerによって作成された( によって使用されるScheduler.NewThread)スレッドには、 という名前が付けられEvent Loop #ます。これらの名前はデバッガーに表示されます。

于 2012-01-24T16:19:14.687 に答える
6

.ObserveOn(Scheduler.ThreadPool)監視が実行されるスレッドを指示するスレッドスケジューラを取ります。ThreadPoolではなくEventLoopSchedulerを使用する単一のスレッドのように見えます。

于 2012-01-24T16:12:31.327 に答える