public async Task TestTimingWheel() { var outputs = new Dictionary <string, DateTime>(); // 秒级时间轮,设置起始时间为1小时前 var timer = TimingWheelTimer.Build(TimeSpan.FromSeconds(1), 10, DateTimeHelper.GetTimestamp() - 3600 * 1000); outputs.Add("00", DateTime.Now); timer.AddTask(TimeSpan.FromMilliseconds(5000), () => { outputs.Add("20", DateTime.Now); }); timer.AddTask(TimeSpan.FromMilliseconds(2000), () => { outputs.Add("11", DateTime.Now); }); timer.Start(); timer.AddTask(TimeSpan.FromSeconds(12), () => { outputs.Add("30", DateTime.Now); }); timer.AddTask(TimeSpan.FromSeconds(2), () => { outputs.Add("12", DateTime.Now); }); await Task.Delay(TimeSpan.FromSeconds(15)); timer.Stop(); outputs.Add("99", DateTime.Now); Console.WriteLine(string.Join(Environment.NewLine, outputs.Select(o => $"{o.Key}, {o.Value:HH:mm:ss.ffff}"))); Assert.AreEqual(6, outputs.Count); Assert.AreEqual(2, Calc(outputs.Skip(1).First().Value, outputs.First().Value)); Assert.AreEqual(2, Calc(outputs.Skip(2).First().Value, outputs.First().Value)); Assert.AreEqual(5, Calc(outputs.Skip(3).First().Value, outputs.First().Value)); Assert.AreEqual(12, Calc(outputs.Skip(4).First().Value, outputs.First().Value)); }
static async Task Main(string[] args) { var timer = TimingWheelTimer.Build(TimeSpan.FromSeconds(1), 60); timer.Start(); // 多线程测试 var tasks = new List <Task>(); for (int i = 0; i < 10; i++) { tasks.Add(Task.Factory.StartNew(() => AddTasks(timer).GetAwaiter().GetResult(), TaskCreationOptions.LongRunning)); } await Task.WhenAll(tasks); Console.WriteLine("任务添加完毕!"); while (timer.TaskCount > 0) { Console.WriteLine($"[{DateTime.Now}] 剩余任务数:{timer.TaskCount}"); Console.WriteLine($"剩余任务数:{timer.TaskCount}"); await Task.Delay(TimeSpan.FromMinutes(1)); } timer.Stop(); }