Здравствуйте!
У меня просьба пользователя написать авторегенератор для Acad 2015, чтобы он реагировал на все действия в чертеже и запускал Regen All. Рассматриваю стандартный new Timer(MyMethod, null, 1000, Timeout.Infinite). Но, если я это делаю как команду внутри dll, то получается что она активна весь сеанс работы с чертежом и блокирует возможность вызова других команд. Есть идеи как можно написать регенератор без такого эффекта?
Если абстрагироваться от того, что конечная цель вызывает недоумение и много вопросов, и сосредоточиться только на реализации, то я бы сделал примерно так:
1. Запускаем команду "Начать авторегенерацию".
2. В этой команде подписываемся на нужные события: добавление объектов в чертёж, модификацию объектов и т.д. и т.п.
3. Плюс подписываемся на событие Application.Idle.
После этого команда завершается и остаются работать в фоне только подписки на события. То есть, блокировки для других команд не будет.
4. При срабатывании любого из событий из п.2 включается обработчик, задача которого просто изменить флаг состояния. У флага два состояния. Одно - регенерация не нужна, второе - регенерация требуется. По умолчанию - первое состояние, а когда срабатывает интересующее событие - переключаем на второе состояние.
5. При срабатывании Application.Idle проверяем состояние флага из п.4. Если требуется регенерация - запускаем её. Флаг сбрасываем на начальное состояние.
Ну и, по-хорошему, нужна ещё одна команда - "Закончить авторегенерацию", которая отключает события из п. 2-3. Это когда пользователь осознает масштаб трагедии и захочет вернуть всё в исходное состояние