間隔シーケンスのかなり奇妙な共有と NewThread の使用を無視すると、あなたの問題は真っ向から横たわっているようです
where tick % 1 == 0
読む必要があるとしか想像できない
where tick % 4 == 0 //or ==3 or whatever...
つまり、integer/long 値を 1 で割ると余りが 0 になるため、where 句は意味がありません。
役立つその他のヒント:
- サブスクリプションを接続の前に置きます。つまり、Connectable オブザーバブルを引き続き使用する場合は、メソッドの最後の行として .Connect() 行を置きます。
- テストできるように、使用しているスケジューラに注入することを検討してください
- Task または ThreadPool スケジューラの使用を検討してください。単純なタイマー/インターバル スケジューリングには適しています。NewThread は、この仕事にとって大きなハンマーのように思えます。
- パラメータを使用していないことを示すには、_ 文字を使用します。たとえば、MonsterAction() を呼び出す Action と MonsterDeath を (_=>MonsterAction()) に変更できます。これは、実際にはパラメーターを使用しないことを次の開発者に示します。
- DisposeMonsterAction/DisposeMonstersDeath の名前を MonsterActionSubscription & MonstersDeathSubscription に変更します。
- シーケンスを共有しても何も得られないと思います。内部で実際に作業を行っているのはスケジューラです。実際には、値を 1 秒間に 4 回チェックすると、2 つのシーケンスを使用するよりも多くのコストがかかると想像できます。
あなたの仲間のチームメイト(将来のあなたを含む)のために、これはあなたのニーズに十分にシンプルであることをお勧めします
private void Subscribe(IScheduler timerScheduler){
this.DisposeMonsterAction = Observable.Interval(TimeSpan.FromMilliseconds(250), timerScheduler).Subscribe(_ => MonsterAction());
this.DisposeMonstersDeath = Observable.Interval(TimeSpan.FromMilliseconds(1000), timerScheduler).Subscribe(_ => MonstersDeath());
}
または名前を変更して
private void Subscribe(IScheduler timerScheduler){
this.MonsterActionSubscription = Observable.Interval(TimeSpan.FromMilliseconds(250), timerScheduler).Subscribe(_ => MonsterAction());
this.MonstersDeathSubscription = Observable.Interval(TimeSpan.FromMilliseconds(1000), timerScheduler).Subscribe(_ => MonstersDeath());
}