C# 其中指定了传递给SharpSNMP异步回调的对象的类型?

C# 其中指定了传递给SharpSNMP异步回调的对象的类型?,c#,snmp,sharp-snmp,C#,Snmp,Sharp Snmp,我正在使用SharpSNMP(8.5,NuGet的最新版本)异步轮询设备。它非常简单,而且工作起来似乎很好,但有一件事我甚至从SharpSnmpLib的源代码中也无法弄清楚:提供给回调方法的对象的类型是在哪里指定的 例如: 在这里,我创建了一个新的SNMP GET请求并调用BeginGetResponse var message = new GetRequestMessage(RequestCounter.NextId, VersionCode.V2, community, oids); var

我正在使用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(以下代码段来自):

这将返回一个SnmpMessageAsyncResult对象,但它从未被传递到对udpSocket.BeginReceive的调用中,因此我看不出它后来是如何被传递到回调方法的

当收到回复时,将调用我的handler方法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)是由套接字调用的,即不是从内部调用的

那么,通过什么机制将对象传递给HandlePollCompletion(IAsyncResult ar)aSnmpMessageAsyncResult?也许我对异步模型的理解不如我想象的那样好

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

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


开始/结束对现在已经过时了,您应该将Async方法与Async/await结合使用。

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


开始/结束对现在已过时,您应该将Async方法与Async/await结合使用。

OK。谢谢我只是好奇。关于异步方法,我看到它们在Github中,但显然不在NuGet的最新版本中;您是否计划很快更新版本,还是我应该从Github中提取最新代码并自己编译DLL?@GileNetwork主分支应该很快标记为9.0 RC。是的,新版本很快就要发布了。@GileNetwork 9.0 RC1在这里,RTM很快就要发布了。谢谢-抓到了RC,我现在正在玩。非常感谢。@Gilesatwork我今天发布了最终版本,但是几天前发现了一个关于异步支持的关键问题。这将导致高内存碎片,所以我担心这会成为你的拦路虎。我们将在几周内尝试在9.1或9.5中解决这一问题(进行重大设计更改)。好的。谢谢我只是好奇。关于异步方法,我看到它们在Github中,但显然不在NuGet的最新版本中;您是否计划很快更新版本,还是我应该从Github中提取最新代码并自己编译DLL?@GileNetwork主分支应该很快标记为9.0 RC。是的,新版本很快就要发布了。@GileNetwork 9.0 RC1在这里,RTM很快就要发布了。谢谢-抓到了RC,我现在正在玩。非常感谢。@Gilesatwork我今天发布了最终版本,但是几天前发现了一个关于异步支持的关键问题。这将导致高内存碎片,所以我担心这会成为你的拦路虎。将在几周内尝试在9.1或9.5中解决这一问题(进行重大设计更改)。
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
}