Проверьте, готов ли Revit к закрытию

Во-первых, прошу прощения за опечатки и т. Д. Английский не мой родной язык :)

Я написал надстройку для Revit и сейчас работаю над автоматическим обновлением надстройки. У меня уже есть отсортированные обновления, но я наткнулся на небольшую проблему.

Я проверяю наличие обновлений при запуске Revit (когда Revit создает приложение Addin)

    public Result OnStartup(UIControlledApplication application)
    {
        Result result = CreateApplication(application);
        if (result == Result.Succeeded)
        {
            UpdateService updates = new UpdateService();
            try
            {
                updates.ManageUpdates(application);
            }
            catch (Exception ex)
            {
                NotificationManager.Notify("error", ex.InnerException.Message, messageType.error);
            }
        }
        return result;
    }

и если обновления доступны, я показываю пользователю сообщение с вопросом, хочет ли он обновить. Если да, я хочу закрыть для них Revit и начать обновление.

Проблема в том, что на этом этапе Revit не завершил загрузку, и если я закрою его программно, он выдаст ошибку, потому что он не готов к закрытию еще в течение 5 секунд.

System.Threading.Thread.Sleep(5000);

Решит проблему на моем компьютере, но не обязательно для пользователей, поэтому мне нужен способ проверить, готов ли Revit к закрытию (в состоянии, позволяющем закрыть его).

Итак, вопрос: есть ли способ проверить, можно ли закрыть Revit? У кого-нибудь была такая проблема и решил ее?

(я знаю, что могу проверить наличие обновлений, когда пользователь закроет Revit, но это не идеально ...

Любые идеи?


person Pawel    schedule 20.03.2013    source источник


Ответы (1)


Вы можете попробовать подписаться на событие ApplicationIntitialized - держу пари, оно запускается только тогда, когда Revit полностью загружен.

Из документации:

Событие возникает после того, как Revit был запущен как полностью инициализированный, включая инициализацию внешних приложений.

Итак ... В вашем OnStartup методе сделайте что-нибудь вроде этого:

public Result OnStartup(UIControlledApplication application)
{
    Result result = CreateApplication(application);
    if (result == Result.Succeeded)
    {
        application.Application.ApplicationInitialized += new EventHandler(delegate (Object o, ApplicationInitializedEventArgs a) {
            // this code will be deferred until the application is initialized
            UpdateService updates = new UpdateService();
            try
            {
                updates.ManageUpdates(application);
            }
            catch (Exception ex)
            {
                NotificationManager.Notify("error", ex.InnerException.Message, messageType.error);
            }
        });
    }
    return result;
}

РЕДАКТИРОВАТЬ: Я не заметил, что имел в виду справочник по Revit 2013 API, и пропустил, что 2012 год не имеет ApplicationInitialized события. В этом случае вы можете попытаться подключиться к одному из событий DocumentOpening или Idling, что позволит вам узнать, что приложение инициализировано, но, к сожалению, в тот момент, когда пользователь вот-вот сделает что-то, и это могло его разозлить.

Было бы интересно узнать, срабатывает ли событие Idling без открытого документа - это может решить вашу проблему. Не могли бы вы попробовать это и доложить?

person Daren Thomas    schedule 21.03.2013
comment
Спасибо за вашу помощь :) Я отметил это как ответ, так как это действительно отличный способ решить мою проблему ... если вы используете Revit API 2013 :), к сожалению, мне нужна поддержка 2012 года, так что все еще есть найти решение ... Спасибо :) - person Pawel; 21.03.2013