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

Where is the type of the object passed to an SharpSNMP async callback specified?

我正在使用 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定义在SnmpMessageExtensionclass中,最终调用套接字上的 BeginReceive(以下代码段来自 SharpSNMP code):

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);
}

This returns 一个 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?也许我并不像我认为的那样理解异步模型..

感谢您的见解, 贾尔斯

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

Begin/End 对现在已过时,您应该将 Async 方法与 async/await.

一起使用