public async Task TestTimingWheel() { var outputs = new Dictionary <string, DateTime>(); // Ã뼶ʱ¼äÂÖ var timer = TimingWheelTimer.Build(TimeSpan.FromSeconds(1), 10); 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)); }
public async Task TestTaskStatus() { var timer = TimingWheelTimer.Build(TimeSpan.FromSeconds(1), 10); timer.Start(); var task1 = timer.AddTask(TimeSpan.FromSeconds(5), () => { Thread.Sleep(3000); }); var task2 = timer.AddTask(TimeSpan.FromSeconds(5), () => { throw new Exception(); }); var task3 = timer.AddTask(TimeSpan.FromSeconds(5), () => { throw new Exception(); }); Assert.AreEqual(TimeTaskStaus.Wait, task1.TaskStaus); Assert.AreEqual(TimeTaskStaus.Wait, task2.TaskStaus); Assert.AreEqual(TimeTaskStaus.Wait, task3.TaskStaus); task3.Cancel(); await Task.Delay(TimeSpan.FromSeconds(6)); Assert.AreEqual(TimeTaskStaus.Running, task1.TaskStaus); Assert.AreEqual(TimeTaskStaus.Fail, task2.TaskStaus); Assert.AreEqual(TimeTaskStaus.Cancel, task3.TaskStaus); await Task.Delay(TimeSpan.FromSeconds(4)); Assert.AreEqual(TimeTaskStaus.Success, task1.TaskStaus); timer.Stop(); }
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(); }