C# 可观察。仅在第一个实例中触发间隔

C# 可观察。仅在第一个实例中触发间隔,c#,.net,reactive-programming,system.reactive,monogame,C#,.net,Reactive Programming,System.reactive,Monogame,我正在尝试将反应式扩展用于MonoGame。我不知道这是新的还是有人在我之前尝试过,但我得到的结果好坏参半 我的情况如下。我有一堆宇宙飞船,每2秒投一颗炸弹。我就是这么做的: class SpaceShip { private IDisposable bombDropper; public SpaceShip() { bombDropper = Observable.Interval(TimeSpan.FromSeconds(2))

我正在尝试将反应式扩展用于MonoGame。我不知道这是新的还是有人在我之前尝试过,但我得到的结果好坏参半

我的情况如下。我有一堆
宇宙飞船
,每2秒投一颗炸弹。我就是这么做的:

class SpaceShip
{
    private IDisposable bombDropper;
    public SpaceShip()
    {
        bombDropper = Observable.Interval(TimeSpan.FromSeconds(2))
            .ObserveOn(Dispatcher.CurrentDispatcher)
            .Subscribe(_ =>
            {
                if (Top + Height + 20 < Constants.GroundTop)
                {
                    Stage.AddRelative(new Bomb(), this, RelativePosition.Bottom);
                }
            });
    }
}
级宇宙飞船
{
私人可识别炸弹滴管;
公共宇宙飞船()
{
炸弹滴管=可观察的间隔(时间跨度从秒(2))
.ObserveOn(Dispatcher.CurrentDispatcher)
.Subscribe(=>
{
if(顶部+高度+20<地面)
{
Stage.AddRelative(newbomb(),this,RelativePosition.Bottom);
}
});
}
}
问题是只有第一艘宇宙飞船投下炸弹。为什么?宇宙飞船的每一个实例都是不同的,每一个都有自己的可观察的,但只有第一个是发射事件

有人告诉我:

我有点怀疑你的调度员没有更新或者 在调度程序的同一线程上阻塞,不确定单声道游戏 会有一个调度员往往是一个非常Windows的东西


所以我的问题是:如何修复此代码?

我已修复此问题!你猜怎么着?它与宇宙飞船本身无关,但与它们的生成方式有关

enemyAdder = Observable.Interval(TimeSpan.FromSeconds(3)).Subscribe(_ => this.Add(new Ship()
            {
                Top = Utils.Random.Next((int) Constants.GroundTop),
                Left = width, 
            }));
这个订阅每3秒钟生成一次太空船,但由于某种原因,我忘记了
观测部分

这是固定版本:

enemyAdder = Observable.Interval(TimeSpan.FromSeconds(3)).ObserveOn(Dispatcher.CurrentDispatcher).Subscribe(_ => this.Add(new Ship()
            {
                Top = Utils.Random.Next((int) Constants.GroundTop),
                Left = width, 
            }));
有了ObserveOn,它就成功了!我想知道为什么没有它它就行了。也许我只是幸运而已