传递给指定的SharpSNMP异步回调的对象类型在哪里?

时间:2016-01-26 15:35:29

标签: c# snmp sharp-snmp

我使用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 ?也许我不理解异步模型以及我以为我做过..

感谢您的见解, 贾尔斯。

1 个答案:

答案 0 :(得分:0)

一般来说,您不需要太在意这一点。

开始/结束对现在已经过时,您应该使用async / await的Async方法。