Страница 418 из 502
<b>class StopDemo {</b>
<b> static void Main() {</b>
<b> MyThread mt1 = new MyThread("Мой Поток");</b>
<b> Thread.Sleep(1000); // разрешить порожденному потоку начать свое выполнение</b>
<b> Console.WriteLine("Прерывание потока.");</b>
<b> mt1.Thrd.Abort();</b>
<b> mt1.Thrd.Join(); // ожидать прерывания потока</b>
<b> Console.WriteLine("Основной поток прерван.");</b>
<b> }</b>
<b>}</b>
Вот к какому результату приводит выполнение этой программы.
<b>Мой Поток начат.</b>
<b>1 2 3 4 5 6 7 8 9 10</b>
<b>11 12 13 14 15 16 17 18 19 20</b>
<b>21 22 23 24 25 26 27 28 29 30</b>
<b>31 32 33 34 35 36 37 38 39 40</b>
<b>Прерывание потока.</b>
<b>Основной поток прерван.</b>
-----------------------------
ПРИМЕЧАНИЕ
Метод Abort() не следует применять в качестве обычного средства прерывания потока, поскольку он предназначен для особых случаев. Обычно поток должен завершаться естественным образом, чтобы произошел возврат из метода, выполняющего роль точки входа в него.
-----------------------------
В некоторых случаях оказывается полезной другая форма метода Abort(), приведенная ниже в общем виде:
<b>public void Abort(object stateInfo)</b>
где statelnfo обозначает любую информацию, которую требуется передать потоку, когда он останавливается. Эта информация доступна посредством свойства ExceptionState из класса исключения ThreadAbortException. Подобным образом потоку можно передать код завершения. В приведенном ниже примере программы демонстрируется применение данной формы метода Abort().
<b>// Использовать форму метода Abort (object stateInfo) .</b>
<b>using System;</b>
<b>using System.Threading;</b>
<b>class MyThread {</b>
<b> public Thread Thrd;</b>
<b> public MyThread(string name) {</b>
<b> Thrd = new Thread(this.Run);</b>
<b> Thrd.Name = name;</b>
<b> Thrd.Start();</b>
<b> }</b>
<b> // Это точка входа в поток,</b>
<b> void Run() {</b>
<b> try {</b>
<b> Console.WriteLine(Thrd.Name + " начат.");</b>
<b> for (int i = 1; i <= 1000; i++) {</b>
<b> Console.Write(i + " ");</b>
<b> if((i%10)==0) {</b>
<b> Console.WriteLine();</b>
<b> Thread.Sleep(250);</b>
<b> }</b>
<b> }</b>
<b> Console.WriteLine(Thrd.Name + " завершен нормально.");</b>
<b> } catch(ThreadAbortException exc) {</b>
<b> Console.WriteLine("Поток прерван, код завершения "</b>
<b> + exc.ExceptionState);</b>
<b> }</b>
<b> }</b>
<b>}</b>
<b>class UseAltAbort {</b>
<b> static void Main() {</b>
<b> MyThread mt1 = new MyThread("Мой Поток");</b>
<b> Thread.Sleep(1000);</b><b>// разрешить порожденному потоку начать свое выполнение</b>
<b> Console.WriteLine("Прерывание потока.");</b>
<b> mt1.Thrd.Abort(100);</b>
<b> Console.WriteLine("Основной поток прерван.");</b>
<b> }</b>
<b>}</b>
Эта программа дает следующий результат.
<b>Мой Поток начат.</b>
<b>1 2 3 4 5 6 7 8 9 10</b>
<b>11 12 13 14 15 16 17 18 19 20</b>
<b>21 22 23 24 25 26 27 28 29 30</b>
<b>31 32 33 34 35 36 37 38 39 40</b>
<b>Прерывание потока.</b>
<b>Поток прерван, код завершения 100</b>
<b>Основной поток прерван.</b>