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

Организация поточной обработки с параметрами. Удаленный доступ.

Асинхронный обратный вызов выполняется в потоке, отличном от того, в котором был сделан вызов Beginlnvoke. Если требования к организации поточной обработки просты, то для передачи параметров функциям потока можно использовать асинхронные делегаты. Ссылка на пространство имен Threading (Организация поточной обработки) не нужна. Ссылка на это пространство имен в примере AsynchThreading нужна только для метода Thread::Sleep (Поток::Режим ожидания), используемого в иллюстративных целях.

PrintNumbers суммирует числа от начального целого числа, переданного в качестве параметра, до числа, на 10 большего чем начальное целое число. Результат (сумма) возвращается вызывающей программе. PrintNumbers может использоваться для делегата, определенного как Print (Печать).

//AsynchThreading.h
using namespace System;
// использование пространства имен Система;
using namespace System::Threading;
// использование пространства имен Система::Потоки;
public _delegate int Print(int i);
// делегат int Печать (int i);
public _gc class Numbers
// класс сборщика мусора – Числа
{
public:
int PrintNumbers(int start) // начало
{
int threadld = Thread::CurrentThread › GetHashCoae();
// Поток
Console::WriteLine (
"PrintNumbers Id: {0}",
// " Идентификатор PrintNumbers: {0}"
threadld.ToString());
int sum =0; // сумма = 0 for (int i = start; i < start + 10; i++)
{
Console::WriteLine(i.ToString());
Thread::Sleep(500);
// Поток:: Бездействие sum += i;
// суммируем
}
return sum;
// сумма
}

Функция Main (Главная) определяет два обратных вызова и вызывает их явно с различными начальными целыми числами. Она ждет, пока оба из дескрипторов синхронизации не получат сигнал. Endlnvoke вызывается для обоих и результат выводится на консоль.

Numbers *n = new Numbers;
// новые Числа
Print *pfnl = new Print(n, Numbers::PrintNumbers);
// новая Печать
Print *pfn2 = new Print (n, Numbers::PrintNumbers};
// новая Печать lAsyncResult *arl =
pfnl › BeginInvoke(0, 0, 0);
lAsyncResult *ar2 =
pfn2 › BeginInvoke(100, 0, 0);
WaitHandle *wh [] = new WaitHandle*[2];
wh[0] = ar1 › AsyncWaitHandle;
wh[l] = ar2 › AsyncWaitHandle;
// удостоверимся, что все сделано перед окончанием
WaitHandle::WaitAll(wh);
int suml = pfnl › End!nvoke(arl);
int sum2 = pfn2 › End!nvoke(ar2);
Console::WriteLine(
"Suml = {0} Sum2 = {!}",
suml.ToString(), sum2.ToString());
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.