可观察的(和可取消的)循环

我正在创建一个模拟器。仿真的核心在无限循环中运行,如下所示:


while (true) 

{

      UpdateMachineState();

}

我想介绍Reactive Extensions,以便将该循环执行到另一个线程中并使它可取消,但是我完全迷失了。


由于我的模拟器是GUI应用程序(通用Windows),因此我不会阻止UI线程。


它应该看起来像:


...

while (true) 

{

      if (machine.IsHalted) 

      {

          observer.OnCompleted;

      }


      observer.OnNext(machine.GetState());           

      cancellationToken.ThrowIfCancellationRequested();

}

...

当仿真器进入“停止”状态时,创建的序列最终将完成。否则,它将一直持续推动States(代表其内部状态的对象)。


我试过了Observable.Create,但是提供a的重载CancellationToken需要一个Task<Action>。


小唯快跑啊
浏览 117回答 1
1回答

慕的地8271018

在Rx中的操作方法如下:void Main(){&nbsp; &nbsp; var scheduler = new EventLoopScheduler();&nbsp; &nbsp; var loop = scheduler.Schedule(a =>&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; UpdateMachineState();&nbsp; &nbsp; &nbsp; &nbsp; a();&nbsp; &nbsp; });&nbsp; &nbsp; Thread.Sleep(1);&nbsp; &nbsp; loop.Dispose();}public void UpdateMachineState(){&nbsp; &nbsp; Console.Write(".");}.Schedule我使用的重载以aAction<Action>作为参数。如果您希望重新安排动作,则只需调用内部动作-因此上述代码有效地创建了无限循环。然后.Dispose(),您可以通过调用返回.Schedule来取消循环。另一种选择是使用.Generate运算符:var scheduler = new EventLoopScheduler();var query =&nbsp; &nbsp; Observable&nbsp; &nbsp; &nbsp; &nbsp; .Generate(0, x => true, x => x, x => machine.GetState(), scheduler);var subscription = query.Subscribe(x => Console.Write("."));Thread.Sleep(1);subscription.Dispose();
打开App,查看更多内容
随时随地看视频慕课网APP