2012-02-08 8 views
1

私は別のスレッドで実行したい低速の方法があります。 このメソッドは、アプリケーションのメインスレッドで作成されたCOMオブジェクトの呼び出しを使用します。メインスレッドで作成されたCOMオブジェクトを使用するブロッキングのないコードを実行する

が遅いコードとさせて頂きます。このです:

var bwImg = image.GetBitonalImage(); // <- slow image is a COM created in main thread 
viewer.Document = bwImg; // <-- ATL control accepting the B/W COM image 

ことが重要ならば、私はWPFアプリケーションと「視聴者にこれをやっていることはWinFormsHostです。

私はこれを行うことは、この非同期を作成し、アプリケーションの実行をブロックしないであろうことを想定:

var t = new Thread((ThreadStart)(() => 
{ 
    var bwImg = image.GetBitonalImage(); // <- this is in separate thread 
    Dispatcher.Invoke((Action)(() => 
    { 
     viewer.Document = bwImg; // <- this again on the main 
    })); 
})); 
t.Start(); 

画像がいくつかの後の時点で示されますことを私のためokです、と私はどのように気にしませんかなり後に。

しかし、アプリケーションが同じようにブロックされることが起こります。 私はプロファイリングを行いましたが、実際にはほとんどの時間がGetBitonalImageに費やされましたが、 'viewer.Document = bwImg'にはほとんど使われませんでした。

コードを完全に削除すると、アプリが反応的になるため、他のコードの障害ではありません。

これ以降、同じ画像COMオブジェクト(B/W結果ではなく元のもの)を使用するコードがあります。

これは正しい方法ですか?問題はCOMオブジェクトメソッド呼び出しのためにある可能性がありますか?

答えて

4

あなたのCOMオブジェクトはスレッドセーフですか?そうでない場合は、STAスレッドを使用して作業を行うSTA(シングルスレッドアパートメント)モードで初期化される可能性があります。したがって、新しいスレッドをスピンアップしても、STAスレッドに戻り、UIイベントがブロックされます。 COMライブラリのソースを制御できる場合は、コードが実際にスレッドセーフである限り、これらの設定を変更できます。

編集:関連する記事のセクションにこのリンクがありますが、それはあなたにも当てはまるかもしれません。 UI thread is blocking a background thread calling a COM object

+0

私のケースと思われます。ありがとう –

0

この状況では、正しくは異なる意味があります。 :/

問題はCOMオブジェクトメソッド呼び出しのためにある可能性がありますか?

さて、あなたはその呼び出しを削除し、私が言うと思いますし、アプリケーションが高速に実行された場合:はい..

が、これは、これを行うための正しい方法は何ですか?

最高の答えは質問です:それは機能しますか?もしそうなら、あなたはおそらく正しい軌道にいるでしょう。

私はcomオブジェクトが何をしているのかわからないので、確かに言うのは難しいです。シングルスレッド操作用に設計されていますか?複数のスレッドがインスタンスを作成すると、どのように動作するのでしょうか?言い換えれば、comオブジェクト自体はスレッドセーフですか?私はあなたがすぐにその答えを見つけ出すだろうと思っています。より広範な質問への今

:これはハンドルが長い非同期プロセスを実行する正しい方法

ですか?

はい。

+0

実際に何を言っているのですが、COMオブジェクトのメソッド呼び出しは、それを作成したスレッドで実行され、呼び出しが行われたスレッドを確認するのに気にしません。私はCOMオブジェクトの経験はほとんどありませんが、この場合、私はこれをスピードアップする方法がありません。それは動作しますが、それはアプリをスピードアップしません。 :D –

+0

@MarinoŠimić:いいえ、私はマイケルが言ったと思います。 ;)彼は正しいbtwです。 – NotMe

関連する問題