まだ未解決事項です。C#上のスレッドでOfficeを扱えないみたいなんですよね。
エラーも出ずに応答なし状態。これは困った。

試した事としては、

// 当然、これはOK
this.Convert(tClient);

// ThreadPoolを使ってNG…Poolはダメなのかと思い
ThreadPool.QueueUserWorkItem(new WaitCallback(this.Convert), tClient);

// 単純Thread、NG
Thread tThread = new Thread(new ParameterizedThreadStart(this.Convert));
tThread.Start(tClient);

// MTA設定だからダメなのかと思い、STAにしたけどNG
Thread tThread = new Thread(new ParameterizedThreadStart(this.Convert));
tThread.SetApartmentState(ApartmentState.STA);
tThread.Start(tClient);

さて困った、泥臭いやり方をすればメインスレッドで変換処理を受け付ければよいので、対応可能なんだけど。。。いくらなんでもなぁ。。

まだ調査中です…、今からOfficeでのスレッドサポートを読んで来ます。

(追記)
同一スレッド上からなら扱えると思うので、メインスレッドではなく子スレッドでOfficeを起動すれば問題ないかも。但し、スレッドで分けてやろうとすると、、個々のスレッドごとにOfficeを起動する必要ができてしまう。
また、Officeの起動自体にそれなりの負荷がかかってしまうため、固定スレッドで動作させる方がパフォーマンスとしてもよいと思う。結果、Queueを使ってOfficeThreadに依頼をする形がベストかなと。

カテゴリー: 技術情報

2件のコメント

koreyasu · 2008-02-18 19:41

良い手がみつからないなぁ。。。
結局、メインスレッド上で動かさないとダメなんだけど…、メインスレッド上で動作させる方法がOrz
UIのように、Control.Invokeみたいなのがあればいいんだけどね…。

諦めて、メインスレッドで変換するような実装を試してみます。

koreyasu · 2008-02-18 20:45

結局、諦めた。
 Requestの待ちうけとタスク登録のみ。
 変換作業自体はメインスレッドでのみ実行。
 変換作業終了後、元のスレッドで返信。
という作りに。

問題なく動いてます。もっとスマートな方法あればいいんだけどね。。

コメントを残す

メールアドレスが公開されることはありません。