C# 4.0 полное руководство - 2011
Шрифт:
=
6
в
потоке
Потомок
#3,
Count
=
6
в
потоке
Потомок
#1,
Count
=
7
в
потоке
Потомок
#2,
Count
=
7
в
потоке
Потомок
#3,
Count
=
7
в
потоке
Потомок
#1/
Count
=
8
в
потоке
Потомок
#2,
Count
=
8
в
потоке
Потомок
#3,
Count
=
8
в
потоке
Потомок
#1/
Count
=
9
Потомок #1
В
потоке
Потомок
#2,
Count
=
9
Потомок #2 завершен.
В
потоке
Потомок
#3,
Count
=
9
Потомок #3 завершен.
Потомок #1 присоединен.
Потомок #2 присоединен.
Потомок #3 присоединен.
Основной поток завершен.
Как видите, выполнение потоков завершилось после возврата из последовательного ряда вызовов метода Join .
Передача аргумента потоку
Первоначально в среде .NET Framework нельзя было передавать аргумент потоку, когда он начинался, поскольку у метода, служившего в качестве точки входа в поток, не могло быть параметров. Если же потоку требовалось передать какую-то информацию, то к этой цели приходилось идти различными обходными путями, например использовать общую переменную. Но этот недостаток был впоследствии устранен, и теперь аргумент может быть передан потоку. Для этого придется воспользоваться другими формами метода Start , конструктора класса Thread, а также метода, служащего в качестве точки входа в поток.
Аргумент передается потоку в следующей форме метода Start .
public void Start(object параметр)
Объект, указываемый в качестве аргумента параметр, автоматически передается методу, выполняющему роль точки входа в поток. Следовательно, для того чтобы передать аргумент потоку, достаточно передать его методу Start .
Для применения параметризированной формы метода Start потребуется следующая форма конструктора класса Thread:
public Thread(ParameterizedThreadStart запуск)
где запуск обозначает метод, вызываемый с целью начать выполнение потока. Обратите внимание на то, что в этой форме конструктора запуск имеет тип
ParameterizedThreadStart, а не ThreadStart, как в форме, использовавшейся в предыдущих примерах. В данном случае Parameter izedThreadS tart является делегатом, объявляемым следующим образом.
public delegate void ParameterizedThreadStart(object obj)
Как видите, этот делегат принимает аргумент типа obj ect. Поэтому для правильного применения данной формы конструктора класса Thread у метода, служащего в качестве точки входа в поток, должен быть параметр типа obj ect.
В приведенном ниже примере программы демонстрируется передача аргумента потоку.
// Пример передачи аргумента методу потока.
using System;
using System.Threading;
class MyThread { public int Count; public Thread Thrd;
// Обратите внимание на то, что конструктору класса // MyThread передается также значение типа int. public MyThread(string name, int num) {
Count = 0;
// Вызвать конструктор типа ParameterizedThreadStart // явным образом только ради наглядности примера.