Часть II. Объектно-ориентированное программирование
лись бы, каждое — с интервалом в 5 секунд. Малоприятное занятие —
ожидать. А как только мы разделили печать чисел и вывод сообщения,
направив печать во вторичный поток, то сообщение выдалось на экран
почти мгновенно.
Применение
ParameterizedThreadStart
для создания вторичного потока
показано в приложении, приведенном в листинге 17.4. Результат работы
приложения — на рис. 17.4. Вспомним, что делегат
ThreadStart
запус-
кает только методы, которые ничего не возвращают и не имеют пара-
метров. Если же методу перед его исполнением надо что-то передать, то
следует пользоваться делегатом
ParameterizedThreadStart
, который
запускает любой метод, получающий параметр
System.Object
.
Листинг 17.4
/* Created by SharpDevelop.
* User: user
* Date: 04.01.2013
* Time: 15:36
*
* To change this template use Tools | Options | Coding |
* Edit Standard Headers. */
using System;
using System.Threading;
/* Для использования среды WindowsForms через
подключение ссылки на PresentationFramework 4.0.0.0
и использования этого пространства: */
using System.Windows;
namespace app91_ParametrizedTreadStart
{
class AddParams
{
public int a,b;
public AddParams(int A, int B) // Конструктор
{ a=A;
b=B; }
}
public class Printer
{
public void PrintNumbers()
Глава 17. Работа в многопоточном режиме
403
{
// Вывод чисел:
Console.Write("Выводимые числа: ");
for(int i = 0; i < 10; i++)
{ Console.Write ("{0}, ", i);
Thread.Sleep(5000); // Задержка выполнения
// потока на 5 секунд
}
Console.WriteLine ();
} // PrintNumbers()
} // Printer
class Program
{ // Метод с одним параметром и с возвратом типа void:
// он будет запускаться делегатом
// ParameterizedThreadStart
static void Add(object data) // Метод принимает
// в качестве аргумента метод AddParam()
{
// Готовим ситуацию, когда в качестве объекта
// будет передавать cz класс AddParams
if(data is AddParams)
{
AddParams ap = (AddParams)data; // data имеет тип
// object. Поэтому надо преобразовать
// Теперь можно доставать поля класса
// и работать с ними:
for(int i = 0; i < 10; i++)
{
Console.Write ("{0}, ", i+ap.a + ap.b);
Thread.Sleep(5000); // Задержка выполнения
// потока на 5 секунд
}
}
}
public static void Main()
{
Console.Write("Работа с одним [1] или " +
"с двумя [2] потоками? ");
404
Do'stlaringiz bilan baham: |