Страница 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>