При нажатии на Сумма в примере 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).