C# 其中指定了传递给SharpSNMP异步回调的对象的类型?
我正在使用SharpSNMP(8.5,NuGet的最新版本)异步轮询设备。它非常简单,而且工作起来似乎很好,但有一件事我甚至从SharpSnmpLib的源代码中也无法弄清楚:提供给回调方法的对象的类型是在哪里指定的 例如: 在这里,我创建了一个新的SNMP GET请求并调用BeginGetResponseC# 其中指定了传递给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
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(以下代码段来自):
这将返回一个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
}