为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
小唯快跑啊 2021-04-26 16:18:48
我正在创建一个模拟器。仿真的核心在无限循环中运行,如下所示: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>。
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

在Rx中的操作方法如下:


void Main()

{

    var scheduler = new EventLoopScheduler();

    var loop = scheduler.Schedule(a =>

    {

        UpdateMachineState();

        a();

    });


    Thread.Sleep(1);


    loop.Dispose();

}


public void UpdateMachineState()

{

    Console.Write(".");

}

.Schedule我使用的重载以aAction<Action>作为参数。如果您希望重新安排动作,则只需调用内部动作-因此上述代码有效地创建了无限循环。


然后.Dispose(),您可以通过调用返回.Schedule来取消循环。


另一种选择是使用.Generate运算符:


var scheduler = new EventLoopScheduler();

var query =

    Observable

        .Generate(0, x => true, x => x, x => machine.GetState(), scheduler);


var subscription = query.Subscribe(x => Console.Write("."));


Thread.Sleep(1);


subscription.Dispose();


查看完整回答
反对 回复 2021-05-08
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信