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 コアの使用率の 1 つがかなり高い (~75%) ように見えることに気付きました。

これは、ユーザーのクリックを待っている間に別のボタンをクリックした後のコール スタックの例です。

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

どうすればこれができるのだろうか?
前もって感謝します!

4

1 に答える 1

7

誰かがライブラリのコピーを持っていて、逆コンパイラを使用してコードが何をしているのかを確認しない限り、それがどのように行われるかを正確に伝えることはできません (自分でやりたい場合は、dotPeekが無料で使いやすいです)。

ただし、その動作をどのように説明するかによってApplication.DoEvents()、関数内で繰り返し呼び出される可能性が高くなります。これにより、長時間実行されているプロセスがそれを実行している間に他のメッセージを処理できます。

お気づきのように、これは CPU コストが高いため、ポーリング操作の適切なコーディング プラクティスになることはほとんどありません。独自のコードでは実行しないことをお勧めします。

これを処理する「正しい」方法は、非同期プログラミング パターンの 1 つを使用することです。.NET 4.5 で追加されたasync/await 機能、または4.0 の NuGet パッケージとして追加された async/await 機能( TAP )、ライブラリに独自のイベントを発生させる ( EAP ) 、または終了時に関数にコールバック関数を使用させる ( APM )。関数自体の内部では、ポーリングの代わりにイベントが発生するのを待っている間、CPU パワーを使用しないように、内部でイベント ドリブン システムを使用する必要があります。

于 2013-09-05T14:35:06.090 に答える