LangExt / TimeExt

Other
0 stars 0 forks source link

TimerのTickの順番が保証されていない #16

Open bleis-tift opened 10 years ago

bleis-tift commented 10 years ago

複数のTimerを使ったときに、先に実行されるTimerの中で長いwaitがあると、場合によっては未来のTickが過去のTickよりも先に実行されてしまう。

var tl = new Timeline(origin);

var timerA = tl.CreateTimer(TimeSpan.FromSeconds(5));
var waitA = tl.CreateWaiter(TimeSpan.FromSeconds, 10, 2, 2, 2, 2);
var historyA = new List<DateTime>();
timerA.Tick += (sender, arg) => { historyA.Add(tl.UtcNow); waitA(); };

var timerB = tl.CreateTimer(TimeSpan.FromSeconds(5));
var waitB = tl.CreateWaiter(TimeSpan.FromSeconds, 2, 2, 2, 2, 2);
var historyB = new List<DateTime>();
timerB.Tick += (sender, arg) => { historyB.Add(tl.UtcNow); waitB(); };

tl.WaitForTime(TimeSpan.FromSeconds(29));

var exceptedHistory = Enumerable.Repeat(origin, 5).Select((d, i) => d + TimeSpan.FromSeconds(5 * (i + 1))).ToArray();
Assert.That(historyA.ToArray(), Is.EqualTo(exceptedHistory));
// ここで、historyBが00:05, 00:10, 00:15, 00:20, 00:25になっていてほしいが、
// timerAの一回目のTickによって、00:10, 00:15のTickが先に実行されてしまい、
// 00:10, 00:15, 00:05, 00:20, 00:25となってしまう
Assert.That(historyB.ToArray(), Is.EqualTo(exceptedHistory));