【发布时间】:2013-07-11 04:08:46
【问题描述】:
我需要在两个状态之间交替,每个状态都有不同的间隔时间。
我能想到的最好方法是使用 Reactive Extensions 的 Observable.Generate
这真是太棒了。
根据我在 msdn 和其他网站上阅读的内容,Observable.Finally() 如果 observable “优雅地或异常地终止”。我正在测试以下代码 (在 LINQPad 中)看看它是如何工作的,但我根本无法让 .Final() 触发。
var ia = TimeSpan.FromSeconds(1);
var ib = TimeSpan.FromSeconds(.2);
var start = DateTime.UtcNow;
var ct = new CancellationTokenSource();
var o = Observable.Generate(
true,
// s => !ct.IsCancellationRequested,
s => (DateTime.UtcNow-start) < TimeSpan.FromSeconds(3) && !ct.IsCancellationRequested,
s => !s,
s => s ? "on" : "off",
s => s? ib : ia)
// .TakeUntil(start+TimeSpan.FromSeconds(3))
.Concat(Observable.Return("end"));
o.Subscribe( s=> s.Dump(), ct.Token);
var t = o.ToTask(ct.Token);
t.ContinueWith(x => x.Dump("done"));
o.Finally(() => "finallY".Dump()); // never gets called?
Thread.Sleep(10000);
ct.Cancel();
如果我让 Thread.Sleep 10 秒,可观察序列完成并且 Task.ContinueWith 触发, 但不是 .Finally()。
如果我让 Thread.Sleep 2s,可观察序列被取消并且 Task.ContinueWith 再次触发, 但不是 .Finally()。
为什么不呢?
【问题讨论】:
标签: c# task-parallel-library system.reactive