Добавить в цитаты Настройки чтения

Страница 418 из 502

<b>class StopDemo {</b>

<b>  static void Main() {</b>

<b>    MyThread mt1 = new MyThread(&quot;Мой Поток&quot;);</b>

<b>    Thread.Sleep(1000); // разрешить порожденному потоку начать свое выполнение</b>

<b>    Console.WriteLine(&quot;Прерывание потока.&quot;);</b>

<b>    mt1.Thrd.Abort();</b>

<b>    mt1.Thrd.Join(); // ожидать прерывания потока</b>

<b>    Console.WriteLine(&quot;Основной поток прерван.&quot;);</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 + &quot; начат.&quot;);</b>

<b>      for (int i = 1; i &lt;= 1000; i++)    {</b>

<b>        Console.Write(i + &quot; &quot;);</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 + &quot; завершен нормально.&quot;);</b>

<b>    } catch(ThreadAbortException exc) {</b>

<b>      Console.WriteLine(&quot;Поток прерван, код завершения &quot;</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(&quot;Мой Поток&quot;);</b>

<b>    Thread.Sleep(1000);</b><b>// разрешить порожденному потоку начать свое выполнение</b>

<b>    Console.WriteLine(&quot;Прерывание потока.&quot;);</b>

<b>    mt1.Thrd.Abort(100);</b>

<b>    Console.WriteLine(&quot;Основной поток прерван.&quot;);</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>