Читаем C# 4.0: полное руководство полностью

Основной поток завершен.

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

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

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

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

public void Start(object параметр)

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

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

public Thread(ParameterizedThreadStart запуск)

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

public delegate void ParameterizedThreadStart(object obj)

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

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

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

using System;

using System.Threading;

class MyThread {

  public int Count;

  public Thread Thrd;

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

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

  public MyThread(string name, int num) {

    Count = 0;

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

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

    Thrd = new Thread(this.Run);

    Thrd.Name = name;

    // Здесь переменная num передается методу Start()

    // в качестве аргумента.

    Thrd.Start(num);

  }

  // Обратите внимание на то, что в этой форме метода Run()

  // указывается параметр типа object.

  void Run(object num) {

    Console.WriteLine(Thrd.Name + " начат со счета " + num);

    do {

      Thread.Sleep (500);

      Console.WriteLine("В потоке " + Thrd.Name +

               ", Count = " + Count);

      Count++;

    } while(Count < (int) num);

    Console.WriteLine(Thrd.Name + " завершен.");

  }

}

class PassArgDemo {

  static void Main() {

    // Обратите внимание на то, что число повторений

    // передается этим двум объектам типа MyThread.

    MyThread mt = new MyThread("Потомок #1", 5);

    MyThread mt2 = new MyThread("Потомок #2", 3);

    do {

      Thread.Sleep(100);

    } while (mt.Thrd.IsAlive ||

             mt2.Thrd.IsAlive);

    Console.WriteLine("Основной поток завершен.");

  }

}

Ниже приведен результат выполнения данной программы, хотя у вас он может оказаться несколько иным.

Потомок #1 начат со счета 5

Потомок #2 начат со счета 3

В потоке Потомок #1, Count = 0

В потоке Потомок #2, Count = 0

В потоке Потомок #1, Count = 1

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Adobe InDesign CS3
Adobe InDesign CS3

Книга посвящена верстке и макетированию в программе Adobe InDesign CS3. Помимо того что в ней описываются возможности программы, рассматриваются также принципы и традиции верстки, приводятся примеры решения типичных задач. Все это позволит читателю не только овладеть богатым инструментарием программы, но и грамотно применять его.Материал книги разделен на логические части: теоретические сведения, инструментарий программы, решение задач, – а также рассчитан на два уровня подготовки читателей – начинающих и опытных пользователей, что выгодно отличает книгу от других изданий. Это позволит применять ее как новичкам для знакомства с программой, так и пользователям со стажем для пополнения своих знаний.

Владимир Гавриилович Завгородний , Владимир Завгородний

Программирование, программы, базы данных / Программное обеспечение / Книги по IT
Разработка приложений в среде Linux. Второе издание
Разработка приложений в среде Linux. Второе издание

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет СЃРѕР±РѕР№ отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из РґСЂСѓРіРёС… операционных систем. РџРѕРґСЂРѕР±но рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование СЃРІРѕР±одно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Р

Майкл К. Джонсон , Эрик В. Троан

Программирование, программы, базы данных