Организация поточной обработки с параметрами. Удаленный доступ.
Асинхронный обратный вызов выполняется в потоке, отличном от того, в котором был сделан вызов 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());