Создание Windows-приложений на основе Visual C#

         

Асинхронный запуск произвольного метода


При разработке программного обеспечения наиболее часто требуется запускать асинхронно собственные методы. Для этого нужно проделать следующие шаги:

  • Создать и запустить делегат с необходимой сигнатурой. После этого можно работать со своим методом так же, как и с методами со встроенной поддержкой асинхронной модели программирования.
  • Выбрать механизм оповещения о завершении и подготовить для него все необходимое.
  • Запустить метод асинхронно.
  • Получить результаты в основном потоке и обновить пользовательский интерфейс.

Создайте новое Windows-приложение и назовите его ArbitraryMethod. Добавляем на форму три надписи, два текстовых поля и одну кнопку, и устанавливаем им следующие свойства:

button1, свойствоЗначение
NameBtnRun
Location16; 64
TextСумма
label1, свойствоЗначение
NameLblA
Location8; 24
Size72; 23
TextЗначение А
label2, свойствоЗначение
NameLblB
Location216; 24
Size72; 23
TextЗначение В
label3, свойствоЗначение
NameLblResult
Location128; 64
Size272; 23
Text
textBox1, свойствоЗначение
NameTxbA
Location88; 24
Text
textBox2, свойствоЗначение
NameTxbB
Location296; 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:



Содержание раздела