Иллюстрированный самоучитель по Architecture .NET

Модель приложений .NET. Потоки.

Программа теперь имеет два потока: первоначальный, который выполнял код запуска потока, и поток, который мы только что создали и который попытается забронировать места в гостинице.

public _gc class NewReservation
// класс сборщика мусора NewReservation
{
public:
void MakeReservation()
{
Console::WriteLine(
"Thread {0} starting.", // Запускается поток {О}.
Thread::CurrentThread › // Поток
GetHashCode().ToString());
ReservationResult *result =
hotelBroker › MakeReservation(
customerld, city, hotel, date, numberDays);
// customerld, город, гостиница, дата, numberDays
}
};

Затем в методе Main (Главный) следующий код запускает поток, используя при этом делегат:

NewReservation *reservel =
new NewReservation(customers, hotelBroker); // клиенты
reservel › customerld = 1;
reservel › city = "Boston"; // город = "Бостон";
reservel › hotel = "Presidential"; // гостиница = "Президентская";
reservel › sdate = "12/12/2001";
reservel › numberDays = 3;
// создать делегат для потоков
ThreadStart *threadStartl = new ThreadStart(
reservel,
reservel › MakeReservation);
Thread *threadl = new Thread(threadStartl); // новый Поток
Console::WriteLine(
"Thread {0} starting a new thread.",
// "Поток {0} запускает новый поток. "
Thread::CurrentThread › // Поток
GetHashCode().ToString());
threadl › Start ();

Чтобы заставить первоначальный поток ожидать завершения работы второго потока, вызывается метод Join (Объединить) объекта Thread (Поток). Первоначальный поток теперь заблокирован (находится в состоянии ожидания), пока не завершит работу поток, резервирующий место в гостинице. Результат запроса резервирования места выводится на консоль резервирующим потоком.

// Блокировать этот поток, пока не завершится рабочий поток
threadl › Join(); // Объединение
Console::WriteLine("Done!"); // Завершен

Синхронизация потоков

Приложение может создать несколько потоков. Сейчас мы рассмотрим код на шаге 1 из примера Threading (Организация поточной обработки). Теперь несколько запросов о резервировании делаются одновременно.

NewReservation *reservel =
new NewReservation(customers, hotelBroker); // клиенты
NewReservation *reserve2 =
new NewReservation(customers, hotelBroker); // клиенты
// создать делегат для потоков
ThreadStart *threadStartl = new ThreadStart(
reservel,
reservel › MakeReservation);
ThreadStart *threadStart2 = new ThreadStart(
reserve2,
reserve2 › MakeReservation);
Thread *threadl = new Thread(threadStartl); // новый Поток
Thread *thread2 = new Thread(threadStart2); // новый Поток
Console::WriteLine(
"Thread {0} starting a new thread.",
// "Поток {0} запустил новый поток. "
Thread::CurrentThread › // Поток
GetHashCode().ToString());
threadl › Start(); // Пуск
thread2 › Start();// Пуск
// Блокировать этот поток, пока не завершится рабочий поток
threadl › Join(); // Объединение
thread2 › Join(); // Объединение
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.