Architecture Net или что такое Microsoft.NET?




Изоляция потоков

Исключение, сгенерированное одним потоком, не приведет к отказу в работе другого потока. Пример 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 О
1
2
3
4
5
6
7
8
9
Поток 5 работу закончил

Класс AppDomain (Прикладная область) (обсуждаемый в данной главе позже) позволяет устанавливать обработчик для перехвата исключения UnhandledException.