2016-08-11 72 views
0

我想包装win32 DNS API DnsQueryEx函数,以便它可以通过.NET TPL使用。我无法使用System.Net.Dns名称空间中的托管方法,因为它们没有实现CNAME记录查找。通过本地调用实现异步模式

,想到的唯一方法是与使用非阻塞轮询之间等待定期轮询此操作的结果:上述

await Task.Delay(n) 

的解决方案似乎效率不高。有没有更好的方法来完成这一点?

+0

使用DNS_QUERY_COMPLETION_ROUTINE callback如何doeshould DnsQueryEx通常通知它有一个结果基于任务异步方法?你不能只从Task.Run中调用它并等待结果吗? –

回答

0

documentation明确指出:

如果到DnsQueryEx呼叫异步完成,的的 查询的结果由DNS_QUERY_COMPLETION_ROUTINE回调 pQueryRequest返回,pQueryResults的QueryStatus成员包含 DNS_REQUEST_PENDING ,并且DnsQueryEx返回DNS_REQUEST_PENDING。 应用程序应跟踪传递 到DnsQueryEx中的pQueryResults结构,直到DNS回调成功。应用程序可以使用由DnsQueryEx返回的pCancelHandle句柄 来取消异步查询。

使用TaskCompletionSource以实现pQueryRequest