|
При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Асинхронное программирование
В появившемся окне нажимаем на ссылку Web Services on the local machine (рис. 7.9).
Из появившегося списка выбираем только что созданный web-сервис и переходим по ссылке (рис. 7.10).
В поле Web Reference Name вводим название WebService и нажимаем Add Reference. Название web-cервиса будет названием proxy-класса (рис. 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).


