3

を使用するサードパーティ API と組み合わせて Rx を使用していEventPatternます。StartWatching()この API では、オブジェクトにイベント ハンドラーを登録してから、イベントを開始してトリガーを開始するオブジェクトでメソッド を呼び出します。私はObservable.FromEventPatternRx の世界で API をブリッジするために使用していますが、サブスクリプションが の呼び出しによって正しく呼び出された場合にのみ機能するという非常に奇妙な問題に遭遇していますStartWatching()。以下は、私が見ているものの縮小されたケースです。

これは機能します:

foreach (var iq in interactionQueues)
        {
            Observable.FromEventPattern(iq, "TheEvent")
                .Subscribe(e => Log.Info("I got called!"), 
                       e => Log.Info("Error!", e),
                       () => Console.WriteLine("Seq completed!"));

            iq.StartWatching();
        }

Subscribe()andStartWatching()を別のループで呼び出すと、動作が停止します。

foreach (var iq in interactionQueues)
            Observable.FromEventPattern(iq, "TheEvent")
                .Subscribe(e => Log.Info("I got called!"), 
                       e => Log.Info("Error!", e),
                       () => Console.WriteLine("Seq completed!"));
foreach (var iq in interactionQueues)
           iq.StartWatching();

なぜこれが起こるのかについての私の唯一の考えは、観察または購読が間違ったスレッドで起こっているということです. Scheduler.CurrentThreadand Scheduler.Immediatewith SubscribeOnandを使用してみましObserveOnたが、役に立ちませんでした。他のアイデアはありますか?別のものを試す必要Schedulerがありますか、それともニシンですか?

4

1 に答える 1

1

これをより使いやすい方法でラップしましょう。

public static TheEventArgs WatchEvent(this InteractionQueue this)
{
    var ret = Observable.Create<TheEventArgs>(subj => {
        // This entire block gets called every time someone calls Subscribe
        var disp = new CompositeDisposable();

        // Subscribe to the event
        disp.Add(Observable.FromEventPattern(iq, "TheEvent").Subscribe(subj));

        // Stop watching when we're done
        disp.Add(Disposable.Create(() => iq.StopWatching());

        iq.StartWatching();

        // This is what to Dispose on Unsubscribe
        return disp;
    });

    // When > 1 person Subscribes, only call the block above (i.e. StartWatching) once
    return ret.Multicast(new Subject<TheEventArgs>()).RefCount();
}
于 2012-12-13T22:27:04.130 に答える