非同期メソッドについて、SharpSNMP の新しい 9.0.0 RC1 リリースを試しています。使い方は簡単で、実際には古い同期方式のドロップイン代替品です。
OID のリストを非同期的にポーリングする私のコードは次のとおりです。
// create a new get request message
var message = new GetRequestMessage(Messenger.NextRequestId, VersionCode.V2, SNMPReadCommunity, oids);
// get a new socket
using (Socket udpSocket = SNMPManager.GetSocket())
{
// wait for the response (this is async)
var res = await message.GetResponseAsync(SNMPManager, new UserRegistry(), udpSocket);
// check the variables we received
CheckSnmpResults(res.Pdu().Variables);
}
get-request ごとの OID の数を 25 に制限しています。私のアプリケーションは、c.50 の SNMP デバイスに接続しています。5 分ごとにタイマーが作動し、ループ内で上記のコードを数回実行して、各デバイスで約 100 個の OID をポーリングします。すべて良い。
問題は、message.GetResponseAsync
メソッドがメモリ リークを起こしていることです。ポーリングを実行するたびに、アプリケーションのメモリ使用量が 6 MB または 7 MB 増加します。VS2015 メモリ プロファイラーを使用すると、多数のOverlappedDataオブジェクト (それぞれ 65K) を確認できます。このオブジェクトの数は、実行するたびに増加しますmessage.GetResponseAsync
。したがって、これを実行して 5 分ごとに c.200 の SNMP get-request を受信すると、アプリケーションのメモリ使用量が急激に増加します。
message.GetResponseAsync
どういうわけか間違って使用していますか?これは SharpSNMPLib のバグですか?
ありがとう、ジャイルズ