Как отменить длительные операции, которые требуют запуска на стороне сервера (а не инициированные клиентом) - PullRequest
1 голос
/ 22 октября 2011

У меня есть класс, который предоставляет отменяемые события в соответствии с соглашением о вызове события до изменения состояния объекта и события после изменения состояния. Событие до изменения, выставляемое издателем (сервером), имеет форму StateChanging и имеет в качестве аргумента CancelEventArgs, а событие после изменения - в форме StateChanged. Это предоставляет подписчику (клиенту) события возможность отменить операцию до ее начала.

Теперь я изменил одну из этих операций, сделав ее длительной операцией, и я хотел бы дать абоненту возможность отменить операцию также после ее начала (а также узнать о ходе операции). Я подумал о основанном на событиях асинхронном шаблоне .

Проблема заключается в том, что я хотел бы сохранить шаблон событий до и после изменения, поскольку именно издатель в какой-то момент требует операции, в то время как в асинхронном шаблоне мне кажется, что именно клиент попросить определенную операцию выполнить асинхронно. Другая возможность (но не кажется мне элегантной) может состоять в том, чтобы сервер выставлял событие (например, OperationRequired), которое позволяет клиенту знать, что необходимо выполнить на стороне сервера, и соответственно вызывать метод RunOperationAsync() , Пожалуйста, прокомментируйте и добавьте ваши предложения.

1 Ответ

0 голосов
/ 22 октября 2011

Асинхронный шаблон на основе событий обычно предпочтителен для операций, которые управляются пользовательским интерфейсом.Альтернатива, модель асинхронного программирования, обычно предпочтительнее для серверных или библиотечных API.Если вы решили реализовать EAP, это нормально.

Взгляните на реализацию BackgroundWorker - это лучший пример EAP, который поддерживает отмену, среди прочего.Он предлагает отмену по стандартному методу CancelAsync().

...