Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Работа с делегатом ParameterizedThreadStart

Работа с делегатом ParameterizedThreadStart

Напомним, что делегат ThreadStart может указывать только на методы, возвращающие void и не имеющие аргументов. Во многих случаях этого будет вполне достаточно, но передать данные методу, выполняющемуся во вторичном потоке, вы сможете только с помощью делегата ParameterizedThreadStart. Для примера воссоздадим программную логику проекта AsyncCallbackDelegate, построенного в этой главе выше, но на этот раз используем тип делегата ParameterizedThreadStart.

Сначала создайте новое консольное приложение AddWithThreads и укажите using для пространства имен System.Threading. Поскольку ParameterizedThreadStart может указывать на любой метод, принимающий параметр System.Object, создайте пользовательский тип, содержащий числа для сложения.

class AddParams {
 public int a;
 public int b;
 public AddParams(int numb1, int numb2) {
  a = numb1;
  b = numb2;
 }
}

В классе Program создайте статический метод, который с помощью типа AddParams напечатает сумму соответствующих значений.

public static void Add(object data) {
 if (data is AddParams) {
  Console.WriteLine("ID потока в Add(): {0}", Thread.CurrentThread.GetHashCode());
  AddParams ap = (AddParams)data;
  Console.WriteLine("{0} + {1} равно {2}", ар.a, ар.b, ар.a + ар.b);
 }
}

Программный код Main() в данном случае предельно прост. Просто используйте ParameterizedThreadStart вместо ThreadStart.

static void Main(string[] args) {
 …
 Console.WriteLine("***** Сложение с объектами Thread *****");
 Console.WriteLine("ID потока в Main(): {0}", Thread.CurrentThread.GetHashCode());
 AddParams ap = new AddParams(10, 10);
 Thread t = new Thread(new ParameterizedThreadStart(Add));
 t.Start(ap);
 …
}

Исходный код. Проект AddWithThreads размещен в подкаталоге, соответствующем главе 14.

Оглавление книги


Генерация: 1.664. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз