Изоляция потоков
Исключение, сгенерированное одним потоком, не приведет к отказу в работе другого потока. Пример Threadlsolation демонстрирует это.
_gc class tm // класс сборщика мусора tm { public: void m() { Console::WriteLine( "Thread {0} started", // "Поток {0} начал работу", Thread::CurrentThread › GetHashCode().ToString()); Thread::Sleep(1000); // Поток:: Бездействует forfint i = 0; i < 10; i++) Console::WriteLine(i); Console::WriteLine( "Thread {0} done", // "Поток {0} закончил", Thread::CurrentThread › GetHashCode{).ToString()); } }; _gc class te // класс сборщика мусора te { public: void tue () { Console::WriteLine ( "Thread {0} started", // "Поток {0} начал работу", Thread::CurrentThread › GetHashCode().ToString()); Exception *e = new Exception("Thread Exception"); // Исключение *е = новое Исключение ("Исключение Потока"); throw e; } }; _gc class Threadlsolation // класс сборщика мусора Threadlsolation { public: static void Main() { tm *tt = new tm; // новый tm te *tex = new te; // новый te // создать делегат для потоков ThreadStart *tsl = new ThreadStart(tt, tm::m); ThreadStart *ts2 = new ThreadStart(tex, te::tue); Thread *threadl = new Thread(tsl); // новый Поток (tsl) Thread *thread2 = new Thread(ts2); // новый Поток (ts2) Console::WriteLine( "Thread {0} starting new threads.", // "Поток {0} запускает новые потоки.", Thread::CurrentThread › GetHashCode().ToString()); threadl › Start(); // Пуск thread2 › Start(); // Пуск Console::WriteLine( "Thiead {0} done.", // "Поток {0} закончил.", Thread::CurrentThread › GetHashCode().ToString()); } };
Программа генерирует следующую выдачу. Обращаем внимание читателя на то, что второй поток может продолжать выводить числа даже тогда, когда первый поток прерывается в результате появления необрабатываемого исключения. И, кроме того, может закончиться главный поток, породивший другие два потока, причем это тоже не приведет к завершению этих двух потоков.
Thread 2 starting new threads. Thread 2 done. Thread 5 started Thread 6 started Unhandled Exception: System.Exception: Thread Exception at te.tue() in c:\oi\netcpp\chap8\threadisolation\ threadisolation.h:line 32 0 1 2 3 4 5 6 7 8 9 Thread 5 done
Перевод такой:
Поток 2 запускает новые потоки. Поток 2 работу закончил. Поток 5 стартовал Поток 6 стартовал Необработанное Исключение: Система.Исключение: Исключение Потока в te.tue () в c:\oi\netcpp\chap8\threadisolation\ threadisolation.h:line 32 0 1 2 3 4 5 6 7 8 9 Поток 5 работу закончил
Класс AppDomain (Прикладная область) (обсуждаемый в данной главе позже) позволяет устанавливать обработчик для перехвата исключения UnhandledException.