2013-09-05 12 views
5

最近、私は独自のサードパーティのライブラリに出くわしたスレッドをブロックしないとこのようにメソッドの振る舞いがあります:呼び出しをブロックするが、

public Point ClickOnDrawMat(DrawMat drwmat) 
{ 
    Point pt; 
    //waiting user mouse click on DrawMat and assign to pt 
    return pt; 
} 

はメインスレッドからこのメソッドを呼び出して、私のコードは、それがブロックされますユーザーがクリックするまでこの方法で、ClickOnDrawMatからポイントリターンを取得します。

public void button1_Click(object sender, EventArgs e) 
{ 
    Point userClickedPoint = ClickOnDrawMat(oDrwMat); //Wait until user clicked 
    //Do stuff with point we got 
} 

ただし、メインスレッドはブロックされません。私はまだユーザーのクリックを待っている間、他のボタン/ UIコントロールを押すことができます。
ユーザーのクリックを待っているうちに、CPUコアの使用量がかなり高くなっているようです(〜75%)。

myProgram.frmMain.button2_Click(xxx) Line 23 
[External Code] 
ThirdPartyLib.ClickOnDrawMat(xxx) Line 16 
myProgram.frmMain.button1_Click(xxx) Line 14 

私はこれを行うことができる方法を疑問に思って:それはまだユーザーのクリックを待っている間に、私は別のボタンをクリックした後

そして、これは、コールスタックの一例ですか?
ありがとうございます!

+2

ライブラリとは何ですか? – Servy

+0

コンピュータビジョン用の独自のライブラリであるHalcon。 – user1755712

答えて

7

somoneにライブラリのコピーがあり、コードが何をしているのかを見るためにコンプレッサを使用していない限り、正確にはどのようにしたらいいのかわかりません。dotPeekは無料で使いやすいです)。

しかし、その動作をどのように記述するかによって、関数内で繰り返し呼び出される可能性があります。これにより、長時間実行されているプロセスが処理している間に他のメッセージが処理されます。

これは、あなたが気づいたように、私は自分のコードでそれをやってないことをお勧めします、その高いCPUコストにポーリング操作のほとんど決して良いコーディングプラクティスです。

これを処理するための「正しい」方法はAsynchronous Programming Patternsのいずれかを使用している:async/await featureは、.NET 4.5で追加されたりなどNuGet package for 4.0TAP)、ライブラリは、独自のイベント(EAP)を上げる、または持っています関数は終了時にコールバック関数を使用します(APM)。関数自体の内部では、ポーリングの代わりにイベントが発生するのを待っている間にCPU電源を使用しないように、内部的にイベント駆動型システムを使用する必要があります。

+0

OPがCPUのアクティビティについて述べていることから、この回答は良いと思います。 –

+0

ありがとう!これは奇妙な魔法を説明する!また、dotPeekとAsync/Awaitの提案にも感謝します! .NET 3.5でasync/await機能を使用する方法はありますか? – user1755712

+1

いいえ、async/await以外のオプションを表示するリンクをいくつか追加しました。 –