传递给 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.
一起使用
我正在使用 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.
一起使用