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

         

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


Рассмотрим теперь асинхронный запуск метода и его завершение несколькими способами в очень простом Windows-приложении. Создайте новое приложение и назовите его AsyncMethods. Добавляем на форму три кнопки и три надписи. Устанавливаем следующие свойства элементов управления:

button1, свойствоЗначение
NamebtnEnd
Location8; 16
TextEnd
button2, свойствоЗначение
NamebtnIsComplete
Location8; 56
TextIsComplete
button3, свойствоЗначение
NamebtnCallback
Location8; 96
TextCallback
label1, свойствоЗначение
NamelblEnd
Location104; 16
Size168; 23
Text
label2, свойствоЗначение
NamelblIsComplete
Location104; 56
Size168; 23
Text
label3, свойствоЗначение
NamelblCallback
Location104; 96
Size168; 23
Text

Переходим в код формы. Создаем делегат AsynchronousMethodDelegate:

private delegate string AsynchronousMethodDelegate(ActivateType source);

Создаем метод, предназначенный для асинхронного запуска:

private string AsynchronousMethod(ActivateType source) { string result = String.Empty; switch(source) { case ActivateType.Callback: result = "Callback"; break; case ActivateType.End: result = "End"; break; case ActivateType.IsComplete: result = "Is Complete"; break; } return result; }

В зависимости от выбора значения перечисления ActivateType метод будет возвращать одну из трех переменных типа string — Callback, End или Is Complete. Выбранное значение перечисления будет типом завершения вызова:

private enum ActivateType { End, IsComplete, Callback }

В обработчике кнопки btnEnd выводим результат работы асинхронного метода на надпись lblEnd:

Листинг 7.7.

(html, txt)

В обработчике кнопки btnIsComplete применяем способ завершения работы Pooling и также выводим результат на надпись lblIsComplete:

Листинг 7.8.

(html, txt)

В обработчике кнопки применяем способ завершения работы Callback:

Листинг 7.9.

(html, txt)



Добавляем метод для завершения вызова и выводим результат на надпись lblCallback:

Листинг 7.10.

(html, txt)

Запускаем приложение. Его работа предельно проста — при нажатии на кнопки запускается метод AsynchronousMethod, который завершается одним из асинхронных способов (рис. 7.4).


Рис. 7.4.  Приложение AsyncMethods

На диске, прилагаемом к книге, вы найдете приложение AsyncMethods (Code\Glava7\AsyncMethods).


private void btnIsComplete_Click(object sender, System.EventArgs e) { AsynchronousMethodDelegate asyncDeleg = new AsynchronousMethodDelegate(AsynchronousMethod); // Запускаем асинхронно метод AsynchronousMethod. IAsyncResult ar = asyncDeleg.BeginInvoke(ActivateType.IsComplete, null, null); while(!ar.IsCompleted) { lblIsComplete.Text = "Ожидание"; } // Получаем результаты асинхронного метода. lblIsComplete.Text = asyncDeleg.EndInvoke(ar); }

Листинг 7.8.

В обработчике кнопки применяем способ завершения работы Callback:

private void btnCallback_Click(object sender, System.EventArgs e) { AsynchronousMethodDelegate asyncDeleg = new AsynchronousMethodDelegate(AsynchronousMethod); // Создаем экземпляр callback делегата Callback. AsyncCallback callback = new AsyncCallback(CallbackMethod); // Запускаем асинхронно метод AsynchronousMethod. asyncDeleg.BeginInvoke(ActivateType.Callback, callback, asyncDeleg); }

Листинг 7.9.

Добавляем метод для завершения вызова и выводим результат на надпись lblCallback:

private void CallbackMethod(IAsyncResult ar) { // Приводим к типу AsynchronousMethodDelegate AsynchronousMethodDelegate asyncDeleg = (AsynchronousMethodDelegate)ar.AsyncState; // Получаем результаты асинхронного метода. lblCallback.Text = asyncDeleg.EndInvoke(ar); }

Листинг 7.10.

Запускаем приложение. Его работа предельно проста — при нажатии на кнопки запускается метод AsynchronousMethod, который завершается одним из асинхронных способов (рис. 7.4).


Рис. 7.4.  Приложение AsyncMethods

На диске, прилагаемом к книге, вы найдете приложение AsyncMethods (Code\Glava7\AsyncMethods).


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