Отмена асинхронного удаленного вызова
У меня есть клиент-серверная архитектура, где клиент общается с сервером с помощью.NET Remoting. Сервер обрабатывает всю бизнес-логику и взаимодействие с базой данных. Мне нужно добавить операцию, выполнение которой может занять некоторое время, а возвращаемый набор данных может быть довольно большим. Я думаю об использовании асинхронного вызова для этого. Теперь возникает проблема: предположим, клиент сделал этот асинхронный вызов, операция запустила SQL-запрос, и пользователь либо закрыл клиент, либо нажал кнопку Отмена - что произойдет с операцией? Есть ли способ отменить ожидающий асинхронный вызов, который занят разговором с SQL-сервером?
Благодарю.
2 ответа
Вы могли бы спроектировать взаимодействие клиент-сервер так, чтобы сервер позволял рабочему потоку выполнять SQL-запросы, чтобы он был готов принять другой вызов от клиента. Итак, клиент делает вызов 1 и говорит, что SQL работает. Сервер передает эту работу рабочему потоку и готов к новому входящему. Затем клиент звонит 2 и говорит: "Не бери в голову". Сервер будет вести некоторую бухгалтерию, чтобы убедиться, что он не перезванивает клиенту, когда рабочий поток завершен.
Может ли сервер безопасно прервать рабочий поток. Я не уверен. Будет ли это иметь какое-либо влияние на то, что делает SQL Server. Точно сказать не могу.
Что вы делаете сейчас с незавершенным вызовом, когда клиент закрывает приложение? Вы можете сделать то же самое с асинхронным вызовом.
Да, async - это путь для долгосрочных запросов. Если набор результатов достаточно велик, вы можете даже подумать об отправке его с несколькими ответами с сервера.
Если пользователь нажмет кнопку "Отмена", вы отправите на сервер новое сообщение о том, что вы больше не заинтересованы в результатах. Если запрос SQL выполняется в пуле потоков, вы не можете отменить его.