1

我正在异步使用 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.BeginGetResponseSnmpMessageExtension类中定义,并最终在套接字上调用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?也许我并不像我想象的那样理解异步模型..

谢谢你的洞察力,贾尔斯。

4

1 回答 1

0

一般来说,你不需要太在意。

Begin/End 对现在已过时,您应该将 Async 方法与 async/await 一起使用。

于 2016-01-27T00:29:20.803 回答