2

Microsoft Excel 2007 / 2010 用のアプリケーション レベルの VSTO 4 アドインを開発しています。結果は、.Net 4 クライアント プロファイルを使用した Windows フォーム ベースの DLL です。

ここで、従来の COM-DLL を使用する必要があります。参照を設定し、.Net から COM-Interop 経由で COM メソッドにアクセスすることは問題ありません。

しかし、呼び出す必要がある (同期) メソッドが返されるまでに 1 分以上かかる場合があります。

私はあなたの答えを知っています:ワーカースレッドを使用してください...

Task Parallel Libraryを使用し、長時間持続する操作をワーカー タスクに入れ、GUI (Excel) の応答を維持しました。


しかし: インプロセス COM-Call (ワーカー タスク/スレッド内) は、まだGUI スレッドをブロックしているようです。

  • なんで?Excel が常に STA (シングル スレッド アパートメント) として実行されているためでしょうか。
  • Excel GUI の応答を維持するにはどうすればよいですか?
  • 本当に非同期にする方法はありますか?

回答ありがとうございます。

ヨルク

4

1 に答える 1

0

最後に、このトピックに対する答えを見つけました。

COM Threading Models についてよく読んだ後、InProc-Server として呼び出している COM-DLL の開発者に話を聞きました。

一緒に、COM-DLL のスレッド モデルを変更しました。

  • OLD (ブロッキング): シングルスレッド アパートメント (STA)、(ThreadingModel=Apartment)
  • NEW (ワーキング): マルチスレッド アパートメント (MTA)、(ThreadingModel=Free)

COM-DLL には独自の同期メカニズムがあるため、標準の Windows メッセージ キューを介した同期の欠落によって引き起こされる問題はありません。

問題は、UI スレッドでさえアイドル状態であり、DoEventsを実行しても、重要なウィンドウ メッセージ ( WM_Paintなど) が配信されないことでした。

今はそうです。UI は常に応答しており、COM-DLL への呼び出しは引き続きワーカー スレッドで行われます (前述のように、これはTask Parallel Libraryによって使用されるThreadPoolスレッドです)。

于 2016-01-05T21:59:23.130 に答える