我想包装win32 DNS API DnsQueryEx
函数,以便可以通过.NET TPL使用它。我无法在System.Net.Dns
命名空间中使用托管方法,因为它们没有实现CNAME记录查找。
唯一可以想到的方法是定期轮询此操作的结果,并使用以下方法在轮询之间进行非阻塞等待:
await Task.Delay(n)
上述解决方案似乎效率低下。有没有更好的方法来实现这一目标?
答案 0 :(得分:0)
documentation明确指出:
如果对DnsQueryEx的调用异步完成,则结果 查询由DNS_QUERY_COMPLETION_ROUTINE回调返回 pQueryRequest ,pQueryResults的QueryStatus成员包含 DNS_REQUEST_PENDING,DnsQueryEx返回DNS_REQUEST_PENDING。 应用程序应跟踪传递的pQueryResults结构 进入DnsQueryEx直到DNS回调成功。应用可以 使用返回的pCancelHandle句柄取消异步查询 通过DnsQueryEx。
使用TaskCompletionSource在DNS_QUERY_COMPLETION_ROUTINE callback
pQueryRequest
实现基于任务的异步方法