1

Visual Studio 2010 EnvDTE.OutputWindowPaneに進行状況メッセージを書き込むC#コードがいくつかあります。コードは、Visual Studioメニューから呼び出されます(VSPackageにあります)。

問題は、メニューピックによって呼び出されたすべての処理が完了するまで出力ウィンドウが再描画されないため、各行が追加されたときではなく、出力が一度に表示されることです。これはメインスレッドで実行されているすべての処理に関連していると思われるため、VisualStudioUIを再描画することはできません。

Visual Studioで「メッセージをポンピング」してUIを更新する方法はありますか(Application.DoEvents()のように)?VSPackageはまた、プロジェクトにいくつかのアイテムを挿入しますが、それは「オンザフライ」で発生するようです。遅れているように見えるのは出力ウィンドウだけです。

この機能の候補を見つけることなく、さまざまなDTEオブジェクトを調べました。

4

2 に答える 2

1

沈黙してすみません-私はちょうどこの質問を思い出し、自分で答えると思いました。

Visual Studioのメインスレッドがコードを実行しておらず、UIを更新していないときに表示されるプログレスバーウィンドウを作成することで、問題を大幅に解決することができました。プログレスバー(IVsThreadedWaitDialog2)のドキュメントはほとんどありませんが、ワーカースレッドで実行されているように見え、アクティブなときにVisualStudioをモーダル状態にします。そのため、少なくとも、処理中にVisualStudioがハングしているように見えないようにします。

プログレスバーウィンドウは、Visual Studioが大規模なソリューションを読み込んでいるときに表示されるウィンドウと同じで、[キャンセル]ボタンのオプションがあります。

残念ながら、プログレスバーダイアログにはいくつかのバグがあり(Microsoftに報告されています)、その中で最も重要なのは、VisualStudioウィンドウの背後に表示されることが多いことです。これは一種のショーストッパーなので、プログレスバーが更新されるたびに、ここでコードのバリエーションを使用して、タイトルで進行状況ウィンドウを見つけ、VisualStudioウィンドウスタックの一番上に移動します。

処理をワーカースレッドに移動すると、Visual Studioエディターでテキストを操作する共有コードが実行され、それらの操作の結果が不安定になるため、うまく機能しませんでした(機能する場合もあれば、不可解なCOMエラーが返される場合もあります)。これはタイミングに依存しているように見えました)。

また、ついにVisualStudioでメッセージポンプを見つけました。シェルにはCommonMessagePumpというクラスが含まれています。繰り返しになりますが、それは非常に不十分に文書化されており、入手可能な情報に基づいて完全に正しく機能させることはできませんでした。いずれにせよ、進行状況ダイアログは私の問題を解決しました。

于 2012-06-04T16:09:30.307 に答える
1

私の場合、出力ウィンドウに書き込んだ直後にSystem.Windows.Forms.Application.DoEvents()を呼び出すことができ、それで問題は解決しました。

于 2013-05-17T19:35:50.297 に答える