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

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

<b>Потомок #2 начат.</b>

<b>Потомок #3 начат.</b>

<b>В потоке Потомок #1, Count = 0</b>

<b>В потоке Потомок #3, Count = 0</b>

<b>В потоке Потомок #2, Count = 0</b>

<b>В потоке Потомок #3, Count = 1</b>

<b>В потоке Потомок #2, Count = 1</b>

<b>В потоке Потомок #1, Count = 1</b>

<b>В потоке Потомок #1, Count = 2</b>

<b>В потоке Потомок #3, Count = 2</b>

<b>В потоке Потомок #2, Count = 2</b>

<b>В потоке Потомок #2, Count = 3</b>

<b>В потоке Потомок #3, Count = 3</b>

<b>В потоке Потомок #1, Count = 3</b>

<b>В потоке Потомок #3, Count = 4</b>

<b>В потоке Потомок #1, Count = 4</b>

<b>В потоке Потомок #2, Count = 4</b>

<b>В потоке Потомок #3, Count = 5</b>

<b>В потоке Потомок #1, Count = 5</b>

<b>В потоке Потомок #2, Count = 5</b>

<b>В потоке Потомок #2, Count = 6</b>

<b>В потоке Потомок #1, Count = 6</b>

<b>В потоке Потомок #3, Count = 6</b>

<b>В потоке Потомок #2, Count = 7</b>

<b>В потоке Потомок #1, Count = 7</b>

<b>В потоке Потомок #3, Count = 7</b>

<b>В потоке Потомок #2, Count = 8</b>

<b>В потоке Потомок #1, Count = 8</b>

<b>В потоке Потомок #3, Count = 8</b>

<b>В потоке Потомок #2, Count = 9</b>

<b>Потомок #2 завершен.</b>

<b>В потоке Потомок #1, Count = 9</b>

<b>В потоке Потомок #3, Count = 9</b>

<b>Потомок #3 завершен.</b>

<b>Потомок #1 завершен.</b>

<b>Потомок #1 присоединен.</b>

<b>Потомок #2 присоединен.</b>

<b>Потомок #3 присоединен.</b>

<b>Основной поток завершен.</b>

Как видите, выполнение потоков завершилось после возврата из последовательного ряда вызовов метода Join().

Передача аргумента потоку

Первоначально в среде .NET Framework нельзя было передавать аргумент потоку, когда он начинался, поскольку у метода, служившего в качестве точки входа в поток, не могло быть параметров. Если же потоку требовалось передать какую-то информацию, то к этой цели приходилось идти различными обходными путями, например использовать общую переменную. Но этот недостаток был впоследствии устранен, и теперь аргумент может быть передан потоку. Для этого придется воспользоваться другими формами метода Start(), конструктора класса Thread, а также метода, служащего в качестве точки входа в поток.

Аргумент передается потоку в следующей форме метода Start().

<b>public void Start(object параметр)</b>

Объект, указываемый в качестве аргумента параметр, автоматически передается методу, выполняющему роль точки входа в поток. Следовательно, для того чтобы передать аргумент потоку, достаточно передать его методу Start().

Для применения параметризированной формы метода Start() потребуется следующая форма конструктора класса Thread:

<b>public Thread(ParameterizedThreadStart запуск)</b>

где запуск обозначает метод, вызываемый с целью начать выполнение потока. Обратите внимание на то, что в этой форме конструктора запуск имеет тип ParameterizedThreadStart, а не ThreadStart, как в форме, использовавшейся в предыдущих примерах. В данном случае ParameterizedThreadStart является делегатом, объявляемым следующим образом.

<b>public delegate void ParameterizedThreadStart(object obj)</b>

Как видите, этот делегат принимает аргумент типа object. Поэтому для правильного применения данной формы конструктора класса Thread у метода, служащего в качестве точки входа в поток, должен быть параметр типа object.

В приведенном ниже примере программы демонстрируется передача аргумента потоку.

<b>// Пример передачи аргумента методу потока.</b>

<b>using System;</b>

<b>using System.Threading;</b>

<b>class MyThread {</b>

<b>  public int Count;</b>

<b>  public Thread Thrd;</b>

<b>  // Обратите внимание на то, что конструктору класса</b>

<b>  // MyThread передается также значение типа int.</b>

<b>  public MyThread(string name, int num) {</b>

<b>    Count = 0;</b>

<b>    // Вызвать конструктор типа ParameterizedThreadStart</b>

<b>    // явным образом только ради наглядности примера.</b>