Моя задача - проанализировать огромный файловый журнал, поэтому производительность важна.Для каждой строки журнала: я звоню 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
?