#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. Имеет смысл. Мне потребовалось некоторое время, чтобы понять, что делает код, но теперь это довольно очевидно. В итоге я сделал что-то подобное. Спасибо.