特定のスレッドでオブザーバーを適切に動作させるのに問題があります。
Subject<bool> subjEvent = new Subject<bool>();
Subject<int> subjValue = new Subject<int>();
IScheduler sched = new EventLoopScheduler(ts => new Thread(ts));
subjEvent.ObserveOn(sched).Subscribe(
r =>
{
if(r)
{
Console.WriteLine("Connected On: \t{0}", Thread.CurrentThread.ManagedThreadId);
subjValue.ObserveOn(sched).Subscribe(
x => Console.WriteLine("Recieved On: \t{0}", Thread.CurrentThread.ManagedThreadId));
}else{
Console.WriteLine("Disconnect On: \t{0}", Thread.CurrentThread.ManagedThreadId);
}
}
);
subjEvent.OnNext(true);
for(int i=0; i< 10; i++)
{
subjValue.OnNext(i);
}
subjEvent.OnNext(false);
subjValue.OnCompleted();
subjEvent.OnCompleted();
アイデアは、何かが利用可能になったときにサブスクライブし、その後のイベントでサブスクライブを解除/再サブスクライブすることです。特定の (同じ読み取り) スレッドを監視し、正しい順序を確保する必要があるため、EventLoopScheduler を用意しました。
問題は、値のサブスクリプションから何も得られないことです。
ここで、生成ループ (OnNext の後) に Thread.Sleep(10) を追加すると、完全に正常に動作します。だから私は自分が間違っていることにちょっと当惑しており、助けやアドバイスをくれてとても感謝しています。