Методы Beginlnvoke() и EndInvoke()

Асинхронная природа делегатов

Некоторые программные операции занимают определенное время. И хотя предыдущий метод Add () носил чисто демонстративный характер, давайте предположим, что создано однопоточное приложение, предусматривающее вызов метода на удаленном объекте, выполнение длительного запроса к базе данных, загрузку большого документа или запись 500 строк текста во внешний файл. При выполнении всех этих операций приложение будет какое-то время казаться зависшим. То есть до тех пор, пока будет происходить обработка каждого текущего задания, все остальные возможности данной программы (вроде выбора пунктов меню, щелчков в панели инструментов или вывод на консоль) будут оставаться для пользователя недоступными.

В таком случае естественно напрашивается вопрос о том, а нельзя ли как-то заставить делегат вызывать метод в отдельном потоке для имитации выполнения нескольких

задач "одновременно". Хорошая новость состоит в том, что каждый тип делегата в.NET

наделяется подобной способностью автоматически. Даже еще более хорошей новостью

является то, что для этого совершенно не требуется погружаться в детали пространства

имен System.Threading (хотя, вполне естественно, можно пользоваться тем и другим вместе).

Методы Beginlnvoke() и EndInvoke()

Когда компилятор С# обрабатывает ключевое слово delegate, в генерируемом динамическим образом классе определяются два метода с именами Beginlnvoke () и

Endlnvoke (). В случае нашего делегата BinaryOp прототипы этих методов будут выглядеть следующим образом:

Public sealed class BinaryOp: System.MulticastDelegate

{

// Используется для вызова метода асинхронным образом.

public IAsyncResult Beginlnvoke(int x, int y, AsyncCallback cb, object state);

// Используется для извлечения возвращаемого значения

// вызывавшегося метода.

public int Endlnvoke(IAsyncResult result);

}

Первый набор передаваемых Beginlnvoke () параметров будет формироваться на

основе формата делегата С# (в случае BinaryOp это два целых числа). В качестве двух

последних параметров будут всегда передаваться аргументы System.AsyncCallback и

System.Object. Подробнее о роли этих параметров будет рассказываться чуть позже,

поэтому до того момента мы будем предоставлять для каждого из них значение null.

Важно обратить внимание на то, что возвращаемым значение метода Endlnvoke ()

будет целое число, согласно определению BinaryOp, а вот в качестве параметра ему будет

передаваться значение типа IAsyncResult.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: