class ToyProfiler : IProfiler { public ConcurrentDictionary<Thread, object> Contexts = new ConcurrentDictionary<Thread, object>(); public object GetContext() { object ctx; if(!Contexts.TryGetValue(Thread.CurrentThread, out ctx)) ctx = null; return ctx; } } // ... ConnectionMultiplexer conn = /* initialization */; var profiler = new ToyProfiler(); var thisGroupContext = new object();conn.RegisterProfiler(profiler); var threads = new List<Thread>(); for (var i = 0; i < 16; i++) { var db = conn.GetDatabase(i); var thread = new Thread( delegate() { var threadTasks = new List<Task>(); for (var j = 0; j < 1000; j++) { var task = db.StringSetAsync("" + j, "" + j); threadTasks.Add(task); } Task.WaitAll(threadTasks.ToArray()); } ); profiler.Contexts[thread] = thisGroupContext; threads.Add(thread); }conn.BeginProfiling(thisGroupContext); threads.ForEach(thread => thread.Start()); threads.ForEach(thread => thread.Join()); IEnumerable<IProfiledCommand> timings = conn.FinishProfiling(thisGroupContext);
最后,计时将包含16,000个IProfiledCommand对象-每个发布给redis的命令一个。