public static void Main() { using (var logWriter = new MessageToFileLogWriterFactory().CreateLogWriter()) using (var logger = new LoggerWithDelay(TimeSpan.FromSeconds(5), logWriter)) { if (File.Exists(MessageToFileLogWriterFactory.FileName)) { File.Delete(MessageToFileLogWriterFactory.FileName); } ThreadPool.QueueUserWorkItem(_ => { var t = logger.LogWithDelay("message 1"); // this message should not be in the log output Thread.Sleep(TimeSpan.FromSeconds(1)); t.Cancel(); Console.WriteLine("First have finished"); }); ThreadPool.QueueUserWorkItem(_ => { var t = logger.LogWithDelay("message 2"); // this message should be in the log output Thread.Sleep(TimeSpan.FromSeconds(6)); t.Cancel(); Console.WriteLine("Second have finished"); }); Console.ReadLine(); } }
public void TestMultithreadLog() { const int threadCount = 100; const int maxSecondsDelay = 10; var logDelay = TimeSpan.FromSeconds(maxSecondsDelay / 2); var loggingMessages = new TestLoggingMessage[threadCount]; using (var logWriter = new MessageToFileLogWriterFactory().CreateLogWriter()) using (var logger = new LoggerWithDelay(logDelay, logWriter)) { var random = new Random(); var testTasks = new Task[loggingMessages.Length]; for (int i = 0; i < loggingMessages.Length; i++) { var testLogginMessage = new TestLoggingMessage((i + 1).ToString(), TimeSpan.FromSeconds(random.Next(1, maxSecondsDelay + 1))); loggingMessages[i] = testLogginMessage; testTasks[i] = new Task(t => { var testMessage = (TestLoggingMessage)t; var handler = logger.LogWithDelay(testMessage.Message); Thread.Sleep(testMessage.Delay); handler.Cancel(); }, testLogginMessage); } if (File.Exists(MessageToFileLogWriterFactory.FileName)) { File.Delete(MessageToFileLogWriterFactory.FileName); } testTasks.AsParallel().ForAll(t => t.Start()); Task.WaitAll(testTasks); } var loggedMessages = File.ReadAllLines(MessageToFileLogWriterFactory.FileName); foreach (var testLoggingMessage in loggingMessages) { bool shouldBeLogged = testLoggingMessage.Delay >= logDelay; Assert.AreEqual(shouldBeLogged, loggedMessages.Contains(testLoggingMessage.Message)); } }