Monitor

Те саме що Lock, але з можливістю продовжити роботу після помилки

        private static object locker = new object();

        static void Main(string[] args)

        {

            for (int i = 0; i < 6; i++)

            {

                // new Thread(F1).Start();

                Task.Run(() => F1());

            }

            Console.ReadKey();

        }

        public static void F1()

        {

            try

            {

                Monitor.Enter(locker);

                Console.WriteLine("START> " + Thread.CurrentThread.ManagedThreadId);

                Thread.Sleep(1000);

                throw new Exception();

                Console.WriteLine("END " + Thread.CurrentThread.ManagedThreadId);  //???

            }

            catch (Exception e)

            {

                // error logger

            }

            finally {

                Monitor.Exit(locker);

            } 

        }

START> 11

START> 12

START> 13

START> 14

START> 16

START> 18