|
Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Процессы, домены, потоки в C#
Восстановление потока
В следующем примере мы создадим в клиентском коде основного потока дополнительный поток для одной локальной функции, запустим его на выполнение и извлечем состояние через свойство Thread.ThreadState. Затем попытаемся уничтожить этот поток из того же клиентского кода. Заключим код выполнения функции в защищенный блок, чтобы перехватить исключение ThreadAbortException. В блоке фильтра отловленного исключения восстановим поток методом Thread.ResetAbort() и опять извлечем его состояние через свойство Thread.ThreadState. Для уничтожения потока применим параметризованную перегрузку метода Thread.Abort().
using System;
using System.Threading;
namespace Test
{
class MyClass
{
int i = 0; // Счетчик сообщений в общей памяти потоков
// Клиентский код для управления дополнительным потоком
public MyClass()
{
// Создаем дополнительный поток для функции Func()
ThreadStart del = new ThreadStart(Func);
Thread th = new Thread(del);
th.Start(); // Запускаем на выполнение
// Приостановим основной поток для устранения состязаний
Thread.Sleep(1000);
// Обследуем запущенный дополнительный поток
Console.WriteLine("{1}) Запустили Func()
в потоке {0}",
th.GetHashCode(), ++i);
Console.WriteLine("{1}) Состояние
работающего потока: {0}",
th.ThreadState.ToString(), ++i);
// Пытаемся прервать самовосстанавливающийся поток
th.Abort("Основной поток хочет уничтожить!");
// Приостановим основной поток для устранения состязаний
Thread.Sleep(1000);
// Восстановленная функция закончила работу
Console.WriteLine("{1}) Состояние
завершенного потока: {0}",
th.ThreadState.ToString(), ++i);
}
// Локальная функция, размещаемая в отдельном потоке
void Func()
{
try
{
// Эмулируем бурную деятельность, пока не прервут
for (; ; ) ;
}
catch (ThreadAbortException e)
{
// Обследуем поток
Console.WriteLine("{1}) Выброшено
исключение {2}\n\t" +
"Сообщение: {0}", e.Message,
++i, e.GetType().Name);
Console.WriteLine("{1}) Состояние
потока при " +
"попытке уничтожения:\n\t{0}",
Thread.CurrentThread.ThreadState.ToString(), ++i);
Console.WriteLine("{1}) Сообщение,
переданное " +
"через параметр Abort():\n\t{0}",
e.ExceptionState.ToString(), ++i);
// Самовосстанавливаемся
Thread.ResetAbort();
// Обследуем поток
Console.WriteLine("{1}) Состояние
потока после " +
"восстановления:\n\t{0}",
Thread.CurrentThread.ThreadState.ToString(), ++i);
Console.WriteLine("{1}) Func() выполняется
в потоке {0}",
Thread.CurrentThread.GetHashCode(), ++i);
}
}
}
// Класс с точкой входа
class Program
{
// Исполняется в основном потоке
static void Main()
{
// Настройка консоли
Console.Title = "Попытка уничтожения " +
"самовосстанавливающегося потока";
Console.ForegroundColor = ConsoleColor.White;
Console.CursorVisible = false;
Console.WindowWidth = 51;
Console.WindowHeight = 13;
new MyClass();// Исполняем
// Ждем нажатия клавиши Enter
Console.ReadLine();
}
}
}
Листинг
11.7 .
Попытка уничтожения самовосстанавливающегося потока
В коде примера мы применили статический метод Thread.Sleep(int) для приостановки основного потока, чтобы дать возможность начать выполняться дополнительному потоку. Это нужно для того, чтобы до дополнительного потока дошла очередь и он получил свой квант процессорного времени.
Извлечение информации о состоянии потока
Мы уже частично использовали свойство, только для чтения, Thread.ThreadState в предыдущем примере, чтобы узнать, в каком состоянии находится поток. Мы его применяли и к экземпляру th потока во внешнем коде как th.ThreadState.ToString(), и внутри потока как Thread.CurrentThread.ThreadState.ToString(). Значения этого свойства, устанавливаемые одноименным перечислением System.Threading.ThreadState, позволяют контролировать проводимые с потоком манипуляции и определять, в каком состоянии он в данный момент находится, прежде чем применять к нему какие-то действия.
