我的任务是解析巨大的文件日志,因此性能很重要。对于每个日志行:
我正在呼叫Dns.GetHostAddresses
来获取主机名的IP地址,并将其设置为我的模型的字段之一。
result.Ip = Dns.GetHostAddresses(result.Host)[0].MapToIPv6().ToString();
// Other code and save result to data base
并将结果模型保存到数据库后缀中。
有时GetHostAddresses
会引发"No such host is known"
异常,因此最简单的方法是将其放入try{}catch{}
块中。但据我所知-此功能会降低性能。因此,我发现也有Dns.BeginGetHostAddresses
方法。因此,我尝试使用它并测试在result
模型保存到数据库之前是否未调用异步回调:
Dns.BeginGetHostAddresses(result.Host, (x) =>
{
try
{
// Thread.Sleep(10000);
IPAddress[] addresses = Dns.EndGetHostAddresses(x);
// Thread.Sleep(10000);
IPAddress address = addresses[0];
result.Ip = address?.MapToIPv6().ToString();
}
catch { }
}, null);
// Other code and save result to data base
我看到以这种方式,性能比使用Dns.GetHostAddresses
时要高得多。
使用调试器,我看到回调总是在进入下一行代码之前完成。但是仍然不确定这是调试的副作用还是真实状态。
我的问题是:
async callback
是否在另一个线程中调用,并且可能会在设置字段result
之前将我的模型Ip
保存到数据库吗? < / p>