我需要在兩個狀態之間交替,每個狀態具有不同的間隔時間。
我能想到這樣做的最好方法是使用Reactive Extensions的Observable.Generate ,這非常可怕。Observable.Generate完成後,爲什麼Observable.Finally不會被調用?
從我在msdn和其他網站上閱讀的內容可以看出,如果 observable「優雅或異常終止」,Observable.Finally()應該會啓動。我正在測試以下代碼 (在LINQPad中)以查看它是如何工作的,但我無法得到.Finall()來開火。
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 10S,可觀察序列完成和Task.ContinueWith火災, 但不是。最後()。
如果我創建Thread.Sleep 2s,可觀察序列被取消,Task.ContinueWith再次觸發,但不是.Finally()。
爲什麼不呢?
啊,這是有道理的。最後一種避免多次調用的方法是,不要替換爲原始的IObservable,而只是使用新的單一Subscribe。只需將一行改爲:o。最後(()=>「finallY」.Dump())。Subscribe();' – bj0