我使用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 (以下代码段来自{{ 3}}):
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 ?也许我不理解异步模型以及我以为我做过..
感谢您的见解, 贾尔斯。
答案 0 :(得分:0)
一般来说,您不需要太在意这一点。
开始/结束对现在已经过时,您应该使用async / await的Async方法。