Как сделать блокировку документа вне метода

Автор Тема: Как сделать блокировку документа вне метода  (Прочитано 6501 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Запускаю ранее написанные методы(раньше запускал через командную строку - все работало) через кнопку с Palette. Хватаю исключение elockviolation, как я понял это из-за того что у меня не заблокирован документ. Но документ создается внутри каждого вызываемого метода то есть нужно переписать все методы добавив
Код - C# [Выбрать]
  1.   Document doc = Application.DocumentManager.MdiActiveDocument;
  2.             doc.LockDocument();
? Можно как- то избежать правки всех методов и блокировать документ как-нибудь по-иному?

Отмечено как Решение Atomohod 14-12-2019, 21:47:36

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Во первых, через using
Во вторых, только один раз на все процедуры на самом верхнем уровне вызовов

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Во вторых, только один раз на все процедуры на самом верхнем уровне вызовов
То есть все-таки править каждый метод? Это окажет влияние на команды при запуске из командной строки(нужно сохранить оба варианта вызова- кнопка и командная строка )?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Это окажет влияние на команды при запуске из командной строки(нужно сохранить оба варианта вызова- кнопка и командная строка )?
Всё будет нормально.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Нет, не обязательно. Обработку выносите в отдельные методы. В них к документу вообще можно не обращаться - передайте базу данных и используйте везде, хоть вообще в закрытом файле. А блокировку делайте сразу при нажатии кнопок на палитре. Ну да, если 20 кнопок, то 20 блокировок. Но не более того. И кстати, если Автокад игнорирует повторные блокировки блокированного документа, то те API "чье имя не произносим" могут вам и ексепшен вытолкнуть. Так что не злоупотребляйте.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Спасибо! Как вариант- может лучше на будущее писать async методы и запускать их в отдельных тасках? Или это не поможет?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как вариант- может лучше на будущее писать async методы и запускать их в отдельных тасках?
Ни в коем случае!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Ни в коем случае!
Даже так, а что страшного будет с асинхронным методом? Как быть, если нужно не "морозить" пользовательский интерфейс и выполнять что-то долгое?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Даже так, а что страшного будет с асинхронным методом?
Обращение к AutoCAD должно быть только из главного потока.
Как быть, если нужно не "морозить" пользовательский интерфейс и выполнять что-то долгое?
Что именно "долгое" имеется в виду? Если что-то не относящееся к AutoCAD API, то можно и в отдельном потоке.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение