2011-10-20 3 views
1

私は管理されていないライブラリのラッパーのように動作するC#ライブラリを使用しています。このライブラリはP/Invokeに依存しています。Slow P/Invoke after some times

奇妙なことが起きています。私のWinFormsアプリケーションでは、ボタンを押すと1からNまで繰り返し、各繰り返しでこのライブラリを呼び出します。

ボタンを押すたびに(アプリケーションを終了せずに)、関数からメソッドを呼び出す時間は最初の繰り返し(約0.5秒)では一定ですが、それ以外の場合は、半分は約2分までです。

各反復での作業は多少同じであるので、それは理解できないのです。

私は、ライブラリがアンマネージ関数を呼び出すとき、この遅さが起こることに気付きました。

それができるとどのように私はこれを改善することができるものの任意のアイデア?

ありがとうございます!私は再びループの第1回の繰り返しを、ボタンを押すたびは高速ですが、私は呼んでいるオブジェクトがすでに初期化されていることを

-edit-は注意(それはグローバル静的変数です)!

-edit2-は、これまでのところ私は、専用のスレッドから行われているアンマネージ関数に対するすべての呼び出しを持つことによって、問題を解決するために管理しました。しかし、私はまだメインのGUIスレッドがそれを処理できない理由を知りませんでした(呼び出しを行っている他のスレッドはありませんでした)。

+2

+1あなたの名前だけです。 <3ウォッカ。 – Polynomial

+1

実際にあなたの質問に答えるには、アンマネージドライブラリのコードが問題を引き起こしているように思えます。 P/Invokeは、アンマネージコードが返るまでブロックします。可能であれば、ライブラリをデバッグして、どのコードが長すぎるかを確認してください。 – Polynomial

+0

@ Polynomial Hummしかし、ライブラリを呼び出す前に、私はライブラリをそのように反応させる環境を引き起こしているのでしょうか? –

答えて

1

P/Invokeは、単に通常のライブラリ呼び出し操作でなければなりません。あなたが意味するのは、管理対象から非管理対象への移行が問題であるということです。しかし、私はこれが問題であるとは思っていません。

ストールしているネイティブコードライブラリの可能性が高くなります。恐らく、後の呼び出しでタイムアウトする、ミューテックスやファイルロックなどのリソースが解放されるのを待っていますか? 関数のプロトタイプが正しいこと、およびスタックの不均衡またはそれに相当するもののために例外を受け取っていないことを確認してください。