Здравствуйте, merk, Вы писали:
> если в старте вы начали прием, то в стопе долна быть явная функция снимающая колбек
К сожалению, мне не известен способ отменить запущенную асинхронную операцию.
> нельзя ли как то избавиться от new в колбеке
Да, сделаю remoteEP членом класса, чтобы не создавать каждый раз новый экземпляр.
> тут вопрос. это колбек дезактвируется и пока не скажут стартресив — вызываться не будет?
> это плохо.
Да, callback срабатывает один раз, когда асинхронная операция выполнена. Для получения результата асинхронной операции требуется вызвать EndReceive.
> колбеку нежелательно управлять самим собой.
Я собираюсь попробовать следующую схему. DataReceiver.Start запускает поток, который крутится в цикле, запуская асинхронную операцию получения дейтаграммы и ожидая ее завершения или сигнала к остановке. Callback вообще не используется.
> еще хуже блокировки в колбеке за счет вызова каких то ваших "передач данных подписчикам"
С этим как раз проблем нет — я генерирую event, подписчик которого добавляет пакте в очередь (producer / consumer), задержка минимальна. То, что подписчик обязан обеспечить минимальную задержку, документировано в интерфейсе класса.
Спасибо за ответ. Подумав над вопросами и перечитав
Asynchronous Programming Design Patterns, решил отказаться от callback. Асинхронность по-прежнему нужна, чтобы можно было завершить работу DataReceiver во время ожидания очередного пакета (или если пакетов вообще нет).