Использование делегатов в асинхронном программировании
Асинхронный обратный вызов
Вместо ожидания на дескрипторе, можно передать функцию обратного вызова в Beginlnvoke (или BeginXXX) метод. Именно так и делается в примере AsynchWithCallback (Asynch с обратным вызовом).
RegisterCustomerCbk *rcc = new RegisterCustomerCbk(customers, // клиенты Customers::RegisterCustomer); // Клиенты AsyncCallback *cb = new AsyncCallback(this, CustomerCallback); Object *objectState; // Объект JAsyncResult *ar; forUnt i = 5; i < 10; i++) { firstName = String::Concat(// Строка "FirstName", i.ToString()); lastName = String::Concat(// Строка "SecondName", (i * 2).ToString()); emailAddress = String::Concat(i.ToString(), ".biz"); // Строка objectState = _box(i); ar = rcc › Begin!nvoke(firstName, lastName, emailAddress, cb, objectState); } Console::WriteLine( "Finished registrations… could do some work here."); // "Закончена регистрация… могу сделать // некоторую работу здесь." Thread::Sleep(25); // Поток:: Бездействие Console::WriteLine( "Finished work..waiting to let registrations complete."); // "Закончена работа., жду конца регистрации."); Thread::Sleep(1000); // Поток:: Бездействие
Потом мы получаем результат в функции обратного вызова:
void CustomerCallback(lAsyncResult *ar) { int customerld; AsyncResult *asyncResult = dynamic_cast<AsyncResult *>(ar); RegisterCustomerCbk *rcc = dynamic_cast<RegisterCustoraerCbk *> (asyncResult › AsyncDelegate); customerld = rcc › EndInvoke(ar); Console::WriteLine( AsyncState: {0} Customerld {1} added.", ar › AsyncState, customerld.ToString()); Console::WriteLine( " Could do processing here."); // " Могу сделать обработку здесь." return; }
В этом варианте можно выполнить некоторые действия до завершения регистрации каждого клиента.