我正在创建一个模拟器。仿真的核心在无限循环中运行,如下所示: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();
- 1 回答
- 0 关注
- 116 浏览
添加回答
举报
0/150
提交
取消