private static void Printer(string Message) { ThreadTests.CheckThread(); for (var i = 0; i < 20; i++) { lock (_SyncRoot) //lock (_Messages) { Console.Write("id:{0} ", Thread.CurrentThread.ManagedThreadId); Console.Write("- msg({0}) ", i); Console.WriteLine("\"{0}\"", Message); _Messages.Add(Message); } Thread.Sleep(100); //try //{ // Monitor.Enter(_SyncRoot); // Console.Write("id:{0} ", Thread.CurrentThread.ManagedThreadId); // Console.Write("- msg({0}) ", i); // Console.WriteLine("\"{0}\"", Message); // _Messages.Add(Message); //} //finally //{ // if (Monitor.IsEntered(_SyncRoot)) // Monitor.Exit(_SyncRoot); //} //Thread.Sleep(100); } Console.WriteLine("Поток {0} завершен", Thread.CurrentThread.ManagedThreadId); }
private static readonly object _SyncRoot = new object();//4 байта памяти - главной сделать на чтение - и используем для группировки кода с т.зр. закрытост для прерывания разными потоками private static void ProcessMessage(string mesage) { ThreadTests.CheckThread(); for (int i = 0; i < 3; i++) { lock (_SyncRoot) { Write($"id: {Thread.CurrentThread.ManagedThreadId}"); Write($" msg{i}: "); WriteLine($" \"{mesage}\""); } Thread.Sleep(100); } WriteLine("Finished"); }
private static void ProcessMessage(string Message) { ThreadTests.CheckThread(); for (var i = 0; i < 3; i++) { lock (_SyncRoot) { Console.Write("id:{0} ", Thread.CurrentThread.ManagedThreadId); Console.Write("- msg({0}) ", i); Console.WriteLine("\"{0}\"", Message); } Thread.Sleep(1000); } }