Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Роль класса AsyncResult

Роль класса AsyncResult

В текущей своей форме метод Main() не хранит тип IAsyncResult, возвращаемый из BeginInvoke(), и не вызывает EndInvoke(). Более того, целевой метод делегата AsyncCallback (в данном случае это метод AddComplete()) вообще не имеет доступа к оригинальному делегату BinaryOp, созданному в контексте Main(). Можно, конечно, объявить BinaryOp, как статический член класса, чтобы позволить обоим методам иметь доступ к объекту, но более "элегантным" решением яв-ляетcя использование входного параметра IAsyncResult.

Поступающий на вход параметр IAsyncResult, передаваемый целевому методу делегата AsyncCallback, является экземпляром класса AsyncResult (заметьте, префикс I здесь отсутствует), определенного в пространстве имен System.Runtime. Remoting.Messaging. Статическое свойство AsyncDelegate возвращает ссылку на оригинальный асинхронный делегат, созданный где-то в программе. Таким образом, чтобы получить ссылку на объект делегата BinaryOp, размещенный в Main(), нужно просто преобразовать возвращенный свойством AsyncDelegate тип System.Object в тип BinaryOp. После этого можно вызвать EndInvoke(), как и ожидается.

// Не забудьте добавить директиву 'using' для
// System.Runtime.Remoting.Messaging!
static void AddComplete(IAsyncResult iftAR) {
 Console.WriteLine("Вызван AddComplete() в потоке {0}.", Thread.CurrentThread.GetHashCode());
 Console.WriteLine("Ваше сложение выполнено");
 // Теперь получим результат.
 AsyncResult ar = (AsyncResult)itfAR;
 BinaryOp b = (BinaryOp)ar.AsyncDelegate;
 Console.WriteLine("10 + 10 равно {0}.",
 b.EndInvoke(itfAR));
}

Оглавление книги


Генерация: 1.208. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз