我正在异步使用 SharpSNMP(8.5,NuGet 的最新版本)来轮询设备。这很简单,而且工作起来显然很好,但是即使查看 SharpSnmpLib 的源代码,我也无法弄清楚一件事:其中指定了提供给回调方法的对象的类型。
例如:
在这里,我创建了一个新的SNMP GET请求并调用BeginGetResponse。
var message = new GetRequestMessage(RequestCounter.NextId, VersionCode.V2, community, oids);
var udpSocket = SNMPAddress.GetSocket();
// pass my GetRequestMessage as the state object
var v = message.BeginGetResponse(SNMPAddress, new UserRegistry(), udpSocket, new AsyncCallback(HandlePollCompletion), message);
方法message.BeginGetResponse在SnmpMessageExtension类中定义,并最终在套接字上调用BeginReceive(以下片段来自SharpSNMP 代码):
public static IAsyncResult BeginGetResponse(this ISnmpMessage request, IPEndPoint receiver, UserRegistry registry, Socket udpSocket, AsyncCallback callback, object state)
{
// ** code snipped from example for readability **
var ar = udpSocket.BeginReceive(buffer, 0, bufferSize, SocketFlags.None, callback, state);
return new SnmpMessageAsyncResult(ar, udpSocket, registry, receiver, buffer);
}
这将返回一个SnmpMessageAsyncResult对象,但这永远不会传递给对udpSocket.BeginReceive的调用,所以我看不到它后来如何传递给回调方法。
当回复进来时,我的处理程序方法HandlePollCompletion被调用:
private void HandlePollCompletion(IAsyncResult ar)
{
// grab handle to original message
GetRequestMessage message = (GetRequestMessage)ar.AsyncState;
// end the async call
try
{
var response = message.EndGetResponse(ar);
}
catch (Exception ex) {}
// process reply here
}
如果我在其中设置断点,我可以看到传递给HandlePollCompletion(IAsyncResult ar)的对象ar具有SnmpMessageAsyncResult类型。
但据我所见,HandlePollResult(IAsyncResult ar)是由套接字调用的,即不是从 SharpSNMP 中调用的。
那么通过什么机制将对象传递给HandlePollCompletion(IAsyncResult ar)一个SnmpMessageAsyncResult?也许我并不像我想象的那样理解异步模型..
谢谢你的洞察力,贾尔斯。