Изоляция потоков
Исключение, сгенерированное одним потоком, не приведет к отказу в работе другого потока. Пример 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.
