Опубликован: 11.09.2006 | Уровень: специалист | Доступ: платный
Лекция 7:

Асинхронное программирование

В появившемся окне нажимаем на ссылку Web Services on the local machine (рис. 7.9).

Окно Add Web Reference

увеличить изображение
Рис. 7.9. Окно Add Web Reference

Из появившегося списка выбираем только что созданный web-сервис и переходим по ссылке (рис. 7.10).

В поле Web Reference Name вводим название WebService и нажимаем Add Reference. Название web-cервиса будет названием proxy-класса (рис. 7.11).

Свойства выбранного сервиса

увеличить изображение
Рис. 7.11. Свойства выбранного сервиса

После добавления сервиса к приложению в окне Solution Explorer появляется ссылка на него.

Из окна Toolbox перетаскиваем на форму две кнопки и надпись. Расположите их так, как показано на рис. 7.7. Называем кнопки btnSync и btnAsync соответственно, а надпись — lblHelloWorld. В обработчике кнопки btnSync будем вызывать сервис синхронно, т. е. обычным способом:

private void btnSync_Click(object sender, System.EventArgs e)
	{
		// Деактивируем кнопку.
		btnSync.Enabled = false;
		// Создаем  экземпляр Web-службы
		WebService.Service1 service = new 
			WebService.Service1();
		// Запуск метода
		lblHelloWorld.Text = service.HelloWorld();
		// Активируем  кнопку.
		btnSync.Enabled = true;

	}

Для асинхронного запуска добавляем обработчик кнопки btnAsync и метод AsyncCallBackMethod:

private void btnAsync_Click(object sender, System.EventArgs e)
	{
		// Деактивируем кнопку.
		btnAsync.Enabled = false;
		// Создаем  экземпляр web-службы
		WebService.Service1 service = new WebService.Service1();			
		// Запуск метод асинхронно
		service.BeginHelloWorld(new AsyncCallback(AsyncCallBackMethod), service);

	}
	private void AsyncCallBackMethod(IAsyncResult ar)
	{
		WebService.Service1 service = (WebService.Service1)ar.AsyncState;
		lblHelloWorld.Text = service.EndHelloWorld(ar);
		// Активируем  кнопку.
		btnAsync.Enabled = true;
	}

Запускаем проект и нажимаем на кнопку Sync. Кнопка становится неактивной на время подключения к web-сервису, затем выводится строка Hello World — содержимое метода HelloWorld. В течение подключения приложение зависает; попробуйте перемещать форму по экрану. Нажимаем на кнопку btnAsync — в этом случае форма отвечает на запросы, поскольку основной поток свободен, а выполнение метода web-службы происходит в параллельном потоке.

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

Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/

Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000