2011-05-17 7 views
1

Excel COM APIを使用してExcel 2003に読み書きするいくつかのコードがプロジェクトにあります。今度はこのコードが2つの場所から呼び出されます:
1. Excelアドイン自体の中から、同じスレッドで。
2.別のスレッドでWPFウィンドウが呼び出されたWPFアプリケーションから。別のスレッドでExcelから読み取るWPFアプリケーションのパフォーマンスが悪い

問題は、WPFアプリケーションがコードを呼び出すときに、Excelからの読み取りに10秒かかる通常の操作に2分かかります。私はそれが新しいスレッドからの呼び出しのためだと思うが、私は100%確実ではない。

アイデア?

+0

私はExcelの中で実行されているコードに基づいて10秒の目標を取る? WPF COM呼び出しは、おそらくExcelプロセスを開始する必要があります。既に実行中のプロセスで試しましたか? –

+0

あなたは正しいです。 10秒間のターゲットは、Excel内のコードに基づいています。しかし、WPF経由であっても、Excelは常に開いており、コードはそのインスタンスで呼び出されます。 Excel COM APIは、Excelファイルの名前をどこにも指定する必要がないので、アクティブなインスタンスで機能します。 – aliensurfer

+0

私がおそらく提案できるのは、2つのプロセスの間に不快感があることだけです。すべてのデータは、プロセスの境界を越えてマーシャルする必要があり、管理対象から非管理対象にマーシャリングする必要があります。不快感がこれを悪化させます。面倒なことがなければ、パフォーマンスの問題がどこにあるのか分かりません。 –

答えて

3

あなたは、考慮すべき多くのものがあります。

  • COM APIは、おそらくExcelのプロセスを起動します。プロセスを開始して準備が整うのを待つのに時間がかかります。
  • プロセス境界が交差している可能性がありますが、これはプロセス内のものよりも遅いです。
  • コードで作成したCOMオブジェクトのスレッドアフィニティのトラップに陥っている可能性があります。それらは作成されたスレッドと親和性があるかもしれません。つまり、別のスレッドでCOMオブジェクトを使用しても、そのコードの実際の実行はオブジェクトの所有スレッドにマーシャリングされます。ただし、コードが十分に集中していると、UIが不安定になるので、これは明らかです。

申し訳ありませんが、これは直接的な回答ではありませんが、いくつか指摘しておきます。

+0

かなりのビットでパフォーマンスを向上させるように管理されました(今や、どの操作も10-12秒かかります)。ヒントをありがとう。 – aliensurfer

+0

@Prakash最後に正確な問題を特定しましたか?私が言及したポイントの1つでしたか? –

+1

問題は、別々のスレッド間の通信にありました。現在のスレッドのDispatcherに渡して、すべてのメッセージがそのDispatcherによって代わりに処理されるように変更しました。それがトリックでした。 – aliensurfer

関連する問題