首先,我为任何错别字等道歉。英语不是我的第一语言:)
我为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时我可以检查更新,但这并不理想......
有什么想法吗?
答案 0 :(得分:3)
您可以尝试订阅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
事件是否在未打开文档的情况下触发将会很有趣 - 这可能会解决您的问题。你可以尝试一下并报告回来吗?