Асинхронный запуск метода с различными вариантами завершения вызова
Рассмотрим теперь асинхронный запуск метода и его завершение несколькими способами в очень простом Windows-приложении. Создайте новое приложение и назовите его AsyncMethods. Добавляем на форму три кнопки и три надписи. Устанавливаем следующие свойства элементов управления:
Name | btnEnd |
Location | 8; 16 |
Text | End |
Name | btnIsComplete |
Location | 8; 56 |
Text | IsComplete |
Name | btnCallback |
Location | 8; 96 |
Text | Callback |
Name | lblEnd |
Location | 104; 16 |
Size | 168; 23 |
Text |
Name | lblIsComplete |
Location | 104; 56 |
Size | 168; 23 |
Text |
Name | lblCallback |
Location | 104; 96 |
Size | 168; 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).