Асинхронный запуск произвольного метода
При разработке программного обеспечения наиболее часто требуется запускать асинхронно собственные методы. Для этого нужно проделать следующие шаги:
- Создать и запустить делегат с необходимой сигнатурой. После этого можно работать со своим методом так же, как и с методами со встроенной поддержкой асинхронной модели программирования.
- Выбрать механизм оповещения о завершении и подготовить для него все необходимое.
- Запустить метод асинхронно.
- Получить результаты в основном потоке и обновить пользовательский интерфейс.
Создайте новое Windows-приложение и назовите его ArbitraryMethod. Добавляем на форму три надписи, два текстовых поля и одну кнопку, и устанавливаем им следующие свойства:
Name | BtnRun |
Location | 16; 64 |
Text | Сумма |
Name | LblA |
Location | 8; 24 |
Size | 72; 23 |
Text | Значение А |
Name | LblB |
Location | 216; 24 |
Size | 72; 23 |
Text | Значение В |
Name | LblResult |
Location | 128; 64 |
Size | 272; 23 |
Text |
Name | TxbA |
Location | 88; 24 |
Text |
Name | TxbB |
Location | 296; 24 |
Text |
Устанавливаем свойству Size формы значение 424; 144 и заголовок "Асинхронный запуск произвольного метода". Переходим в код формы. Создание делегата в данном случае ничем не отличается от общих правил, рассмотренных в первой лекции:
Листинг 7.4.
(html, txt)
Создаем метод Summ, в котором будут складываться числа, вводимые в два текстовых поля:
private int Summ(int a, int b) { return a+b; }
Обработчик кнопки btnRun будет выглядеть следующим образом:
Листинг 7.5.
(html, txt)
Мы создали экземпляр summdelegate делегата AsyncSumm и проинициализировали его методом Summ:
AsyncSumm summdelegate = new AsyncSumm(Summ);
Для использования механизма Сallback создали экземпляр делегата AsyncCallBack:
AsyncCallback cb = new AsyncCallback(CallBackMethod);
Метод CallBackMethod имеет сигнатуру, принимающую один параметр типа IAsyncResult и не возвращающую значений. После того как делегат инициализирован методом, можно запускать прикрепленный к делегату метод асинхронно с помощью метода BeginInvoke. Этот метод принимает две переменные типа int а и b, экземпляр cb делегата AsyncCallback и экземпляр summdelegate делегата SummDelegate: