Отмена асинхронных вызовов веб-служб

#c# #multithreading #web-services

#c# #многопоточность #веб-службы

Вопрос:

Мне нужно иметь возможность отменять асинхронные вызовы, выполняемые моим веб-сервисом. Одно из решений, которое у меня есть, — использовать управление собственными потоками и использовать синхронные методы из SOAP-клиента. Это работает нормально, и для этого требуется более тонкое управление потоками.

Если бы я использовал любой из этих двух шаблонов, предоставленных при добавлении ссылки на веб-службу, скажем:

 var Client = new ASL_WS.SvcSoapClient()
IAsyncResult result = Client.BeginAuthenticateUser(Email, Password, new AsyncCallback(AuthCompleted));
  

или

 var Client = new ASL_WS.SvcSoapClient()
Client.AuthenticateUserCompleted  = AuthCompleted;
Client.AuthenticateUserAsync(Email, Passsword);
  

какой-либо из этих двух шаблонов дает мне способ отменить запрос? Одним из вариантов использования может быть: пользователь входит в систему, но хочет отменить ее до завершения вызова аутентификации.

Конечно, я мог бы реализовать это по-другому, изменив AsyncState, передаваемый этим вызовам, и установив его для отключения обновления пользовательского интерфейса, но это не то, что я ищу.

Могу ли я просто отменить все невыполненные операции. Выполняет ли клиент.Abort() отменяет такие операции. Что делать, если есть много асинхронных запросов, все отменяются? Существуют ли какие-либо другие методы API, которые могут это сделать?

Ответ №1:

Да, вы можете использовать метод прерывания, но имейте в виду примечания ниже. Вы также можете использовать CancelAsync .

Примечания к прерыванию: http://msdn.microsoft.com/en-us/library/aa480512.aspx

Когда вы вызываете метод прерывания, все невыполненные запросы все равно будут завершены, но они завершатся с ошибкой. Это означает, что если вы используете обратные вызовы, ваша функция обратного вызова все равно будет вызываться для каждого невыполненного запроса. При вызове метода EndInvoke или, в нашем случае, функции-оболочки EndDelayedResponse будет сгенерирована ошибка, указывающая на то, что базовое соединение было закрыто.

Пример отмены асинхронности: http://www.codeproject.com/KB/cpp/wsasync.aspx

Комментарии:

1. Имеет смысл. Мне потребовалось некоторое время, чтобы понять, что делает код, но теперь это довольно очевидно. В итоге я сделал что-то подобное. Спасибо.