/// <summary> /// Display scheduler. /// </summary> /// <param name="writeScheduler"></param> static void DisplayScheduler(IWriteScheduler writeScheduler) { lock (writeScheduler.SyncRoot) { int priority = 0; foreach (DeviceInfo device in writeScheduler.ToArray()) { Console.WriteLine("[{0}] si [{1}]={2}", DateTime.Now.ToFileTime(), priority++, device); } } }
/// <summary> /// Run test program. /// </summary> /// <param name="program"></param> static void Run(SchedulerType schedulerType, string deviceFolder, int fileCount, int taskCount) { // Report program options Console.WriteLine("[{0}] pi scheduler type = {1}", DateTime.Now.ToFileTime(), schedulerType); Console.WriteLine("[{0}] pi device folder = {1}", DateTime.Now.ToFileTime(), deviceFolder); Console.WriteLine("[{0}] pi file count = {1}", DateTime.Now.ToFileTime(), fileCount); Console.WriteLine("[{0}] pm {1}kb", DateTime.Now.ToFileTime(), GC.GetTotalMemory(true) / 1024); FileGenerator fileGenerator = GetFileGenerator(); IWriteScheduler writeScheduler = CreateWriteScheduler(schedulerType); foreach (IDevice device in GetDevices(new DirectoryInfo(deviceFolder))) { Console.WriteLine("[{0}] pi register device {1}", DateTime.Now.ToFileTime(), device.Id); writeScheduler.Register(device); } // Test using sequential writes. Console.WriteLine("[{0}] pm {1}kb", DateTime.Now.ToFileTime(), GC.GetTotalMemory(true) / 1024); DisplayScheduler(writeScheduler); foreach (Tuple <string, byte[]> current in fileGenerator.GetFiles(fileCount)) { writeScheduler.Write(current.Item1, current.Item2); DisplayScheduler(writeScheduler); } Console.WriteLine("[{0}] pm {1}kb", DateTime.Now.ToFileTime(), GC.GetTotalMemory(true) / 1024); // Test using concurrent writes. Task[] tasks = new Task[taskCount]; for (int i = 0; i < tasks.Length; i++) { tasks[i] = new Task(() => { foreach (Tuple <string, byte[]> current in fileGenerator.GetFiles(fileCount)) { writeScheduler.Write(current.Item1, current.Item2); DisplayScheduler(writeScheduler); } }); tasks[i].Start(); } Task.WaitAll(tasks); }