Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Процессы, домены, потоки в C#
Помещение в поток нескольких функции
В отдельный поток можно помещать несколько функций, указав их во внутреннем списке объекта-делегата ThreadStart. При обычном выполнении приложения происходит то же самое - все функции выполняются в одном потоке. А здесь мы часть функций сами размещаем в отдельном потоке, используя делегат стандартным способом. Обратите внимание, что делегат может адресовать только функции с пустой сигнатурой и без возвращаемого значения, поскольку объявлен в библиотеке так
public delegate void ThreadStart();
Приведем пример
using System; using System.Threading; namespace Test { class MyClass { // Открытые поля с маркерами потоков для упрощения кода public int mBase, mFunc1, mFunc2; // Конструктор исполняется в основном потоке public MyClass() { // Извлекаем маркер текущего потока mBase = Thread.CurrentThread.GetHashCode(); // Создаем делегат со ссылками на две функции ThreadStart del = new ThreadStart(Func1); del += Func2; Thread th = new Thread(del); // Создаем поток th.Start(); // Выполнить функции } // Метод будет исполняться в дополнительном потоке private void Func1() { // Извлекаем маркер текущего потока mFunc1 = Thread.CurrentThread.GetHashCode(); } // Этот метод также будет исполняться в дополнительном потоке private void Func2() { // Извлекаем маркер текущего потока mFunc2 = Thread.CurrentThread.GetHashCode(); } } // Класс с точкой входа class Program { // Исполняется в основном потоке static void Main() { // Настройка консоли Console.Title = "Помещение в поток нескольких функции"; Console.ForegroundColor = ConsoleColor.White; Console.CursorVisible = false; Console.WindowWidth = 39; Console.WindowHeight = 5; MyClass obj = new MyClass();// Исполняем // Показываем маркеры Console.WriteLine("Поток выполнения метода MyClass(): " + obj.mBase); Console.WriteLine("Поток выполнения метода Func1(): " + obj.mFunc1); Console.WriteLine("Поток выполнения метода Func2(): " + obj.mFunc2); Console.WriteLine("Поток выполнения метода Main(): " + Thread.CurrentThread.GetHashCode()); Console.ReadLine(); // Ждем нажатия клавиши Enter } } }Листинг 11.5 . Помещение в поток нескольких функции
Уничтожение потока
Для уничтожения потока применяется метод Abort(), который может использоваться как без параметра, так и с параметром типа Object. При использовании метода Abort() с параметром в параметре можно разместить любую информацию. Метод Abort() инициирует выброс исключения типа ThreadAbortException, в экземпляр которого будет помещена эта информация. Это исключение надо обрабатывать, иначе будет выброшено необработанное системное исключение. При вызове метода Abort() свойство состояния потока System.Threading.Thread.ThreadState устанавливается в значение одноименного перечисления System.Threading.ThreadState.AbortRequested.
При попытке уничтожения потока его работа немедленно прерывается на выполнении текущей команды. Но если поток в это время выполнял команды неуправляемого кода, например, обращался к некоторой системной функции или внешнему COM -объекту, то среда CRL дождется возвращения потока в управляемую область и сразу прервет его. Возобновить работу потока можно с помощью статического метода Thread. ResetAbort(), но в этом случае поток начнет выполняться не с прерванного состояния, а будет запущен заново.
Вот код приложения, которое прерывает само себя, уничтожая основной поток, в который оно автоматически загружается.
using System; using System.Threading; namespace Test { class MyClass { // Конструктор исполняется в основном потоке public MyClass() { // Основной поток существует, попытаемся его прервать // через защищенный блок кода, чтобы отловить исключение try { Thread.CurrentThread.Abort(); } catch (ThreadAbortException e) { Console.WriteLine("Выброшено исключение ThreadAbortException\n" + "Сообщение: {0}", e.Message); Console.WriteLine("\nНажмите Enter, чтобы завершить основной поток..."); Console.ReadLine(); } } } // Класс с точкой входа class Program { // Исполняется в основном потоке static void Main() { // Настройка консоли Console.Title = "Уничтожение основного потока"; Console.ForegroundColor = ConsoleColor.White; Console.CursorVisible = false; Console.WindowWidth = 49; Console.WindowHeight = 5; new MyClass();// Исполняем и прерываем // Исполнение до сих пор не дойдет, прервется в конструкторе Console.ReadLine(); } } }Листинг 11.6 . Приложение, прерывающее само себя через основной поток