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