Является ли BeginGetHostAddresses асинхронным обратным вызовом, вызванным в другом потоке, чем исходный - PullRequest
1 голос
/ 12 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...