Exemple #1
0
        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));
        }
Exemple #2
0
        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();
        }