1

まず、タイプミスなどをお詫びします。英語は私の母国語ではありません:)

Revit 用のアドインを作成し、アドインの自動更新に取り組んでいます。私はすでに更新をソートしていますが、小さな問題に遭遇しました。

Revit の起動時に更新をチェックしています(Revit がアドイン アプリケーションを作成するとき)

    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 を閉じたときに更新を確認できることはわかっていますが、理想的ではありません...

何か案は?

4

1 に答える 1

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イベントの 1 つに接続しようとすることができます。これにより、アプリケーション初期化されたことを知ることができなくなりますが、悲しいことに、ユーザーが何かをしようとしていて、それが彼を怒らせる可能性があります。

Idlingドキュメントを開かずにイベントが発生するかどうかを知ることは興味深いでしょう- これはあなたの問題を解決するかもしれません. それを試して、また報告していただけますか?

于 2013-03-21T13:05:15.997 に答える