私は、ワードドキュメント内のすべてのテーブルをループし、すべてのセルの幅の値を読み取るコードを持っています。何らかの理由で、ウィンドウが最小化されたときにこのコードが約5〜10倍高速に実行されることに気付きました。アイデアを得るには、with the window maximized, it takes ~0.02 seconds to make the Cell.Width call
を実行すると、with the window minimized, it takes .001 to .0015 seconds per call
が実行されます。Wordウィンドウを最小化するとCOMの速度が向上しますか?
これを引き起こしている可能性があることは誰でも知っていますし、ウィンドウを最小化せずにこれらの結果を再現できるかどうかは誰でも知っています。ユーザーとしては、ウィンドウをランダムに最小化/最大化して操作を行うことは非常に奇妙です。
//doc and app are the active Document and Application respectively.
try
{
app.ScreenUpdating = false;
//app.WindowState = word.WdWindowState.wdWindowStateMinimize; //enabling this improves speeds by 5x to 10x
foreach (word.Table table in doc.Tables)
{
//loop over every cell in a table and read/store its cell.Width value.
}
}
finally
{
//you can alternatively store the original values here and restore them to that. For simplicity, I did not do that here.
app.ScreenUpdating = true;
app.WindowState = word.WdWindowState.wdWindowStateMaximize;
}
これはExcelでこの動作に気付きましたが、これは確定的な回答ではありませんが、UIが表示されているときにのみ実行するコードが必要であると想定しました。たとえば、ダブルバッファリング。 私の推測では、Microsoftがパフォーマンスを向上させるためにこの方法でコード化したということでした。 SItは、重要でないときにUIサイクルをスキップするという論理的な意味を持ちます。 しかし、Office開発チームの誰かがこれを見て回答を投稿しない限り、私はこれについて明確な答えがないと確信しています。 – David
私はいつもWordでこれを気付いています。 MergeFieldを更新している間は、目的に合わせてアプリケーションを最小限に保ちます。開いたままにしておくと、すべての更新がドキュメントを移動してテキストの変更箇所を表示します。もちろん、これはプロセスを遅くします。 – Steve
私はscreenUpdating = falseを設定すると、UIで発生する必要があるバッファリングが処理されると思っていました。私たちに何も支配していないことが起こっていると思いますか?また、 "読み取り"操作がこの効果を引き起こすことは珍しいようです。私はそれが書き込み操作だったらもっと理解できました。 – Shark