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

Использование делегатов в асинхронном программировании

Асинхронный обратный вызов

Вместо ожидания на дескрипторе, можно передать функцию обратного вызова в 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;
}

В этом варианте можно выполнить некоторые действия до завершения регистрации каждого клиента.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.