У меня архитектура клиент-сервер, где клиент взаимодействует с сервером с помощью .NET Remoting. Сервер обрабатывает всю бизнес-логику и взаимодействие с базой данных. Мне нужно добавить операцию, выполнение которой может занять некоторое время, а возвращаемый набор данных может быть довольно большим. Я подумываю использовать для этого асинхронный вызов. Теперь возникает проблема: предположим, что клиент выполнил этот асинхронный вызов, операция запустила SQL-запрос, а пользователь либо закрывает клиент, либо нажимает кнопку «Отмена» - что произойдет с операцией? Есть ли способ отменить ожидающий асинхронный вызов, который занят разговором с SQL-сервером?
Спасибо.





Вы можете спроектировать взаимодействие клиент / сервер так, чтобы сервер позволял рабочему потоку выполнять SQL-запросы, чтобы он был готов принять еще один вызов от клиента. Итак, клиент делает вызов 1 и говорит, что SQL работает. Сервер передает эту работу рабочему потоку и готов к новым входящим потокам. Затем клиент делает звонок 2 и говорит: «Неважно». Сервер будет вести учет, чтобы убедиться, что он не обратится к клиенту, когда рабочий поток завершен.
Может ли сервер безопасно прервать рабочий поток. Я не уверен. Повлияет ли это на то, что делает SQL Server. Не уверена.
Что вы теперь делаете с текущим вызовом, когда клиент закрывает приложение? То же самое можно сделать и с асинхронным вызовом.
Да, асинхронный режим подходит для длительных запросов. Если набор результатов достаточно велик, вы можете даже подумать об отправке его фрагментов с несколькими ответами с сервера.
Когда пользователь нажимает кнопку «Отмена», вы отправляете на сервер новое сообщение о том, что вас больше не интересуют результаты. Если запрос SQL выполняется в пуле потоков, вы не можете его отменить.