Непонятная разница в количестве используемых потоков для кода с await/async и для голой Dns.BeginGetHostEntry/EndGetHostEntry.
Если я вызываю в цикле для некоторого дипазона IP адресов
Dns.BeginGetHostEntry(adr, new AsyncCallback(GetHostEntryCallback), adr);
и потом ловлю результаты в GetHostEntryCallback(IAsyncResult ar), то результат примерно такой (в квдратных скобках [] — идентификаторы потоков):
15:38:03 [ 1]: Начинаем сканирование...
15:38:03 [ 3]: 192.168.4.120 pc
15:38:03 [ 4]: 192.168.4.121 ak
15:38:03 [ 3]: 192.168.4.122 va
15:38:03 [ 4]: 192.168.4.123 mo
15:38:03 [ 3]: 192.168.4.124 pi
15:38:03 [ 4]: 192.168.4.125 cr
15:38:03 [ 4]: 192.168.4.127 se
15:38:04 [ 5]: 192.168.4.129 eg
15:38:05 [ 7]: 192.168.4.132 sh
15:38:06 [ 9]: 192.168.4.135 va
15:38:12 [ 3]: 192.168.4.126 Этот хост неизвестен
15:38:12 [ 4]: 192.168.4.128 Этот хост неизвестен
15:38:13 [ 5]: 192.168.4.130 Этот хост неизвестен
15:38:13 [ 6]: 192.168.4.131 Этот хост неизвестен
15:38:14 [ 7]: 192.168.4.133 Этот хост неизвестен
15:38:15 [ 8]: 192.168.4.134 Этот хост неизвестен
15:38:15 [ 1]: Нажмите Enter для завершения...
всего 8 потоков, 12 сек, операции для отсутствующих ip, самые длительные, висят одновременно. Причем количество потоков можно увеличить еще больше (и сократить время) если задать например ThreadPool.SetMinThreads(50, 50);
Если же в цикле вызывать
IPHostEntry curhost = await Dns.GetHostEntryAsync(adr);
или так:
Task<IPHostEntry> getHostTask = Task<IPHostEntry>.Factory.FromAsync<IPAddress>(Dns.BeginGetHostEntry, Dns.EndGetHostEntry, adr, null);
IPHostEntry curhost = await getHostTask;
то результат такой:
15:32:03 [ 1]: Начинаем сканирование...
15:32:03 [ 3]: 192.168.4.120 pc
15:32:03 [ 3]: 192.168.4.121 ak
15:32:03 [ 4]: 192.168.4.122 va
15:32:03 [ 3]: 192.168.4.123 mo
15:32:03 [ 4]: 192.168.4.124 pi
15:32:03 [ 3]: 192.168.4.125 cr
15:32:12 [ 4]: 192.168.4.126 Этот хост неизвестен
15:32:12 [ 3]: 192.168.4.127 se
15:32:21 [ 4]: 192.168.4.128 Этот хост неизвестен
15:32:21 [ 3]: 192.168.4.129 eg
15:32:30 [ 3]: 192.168.4.130 Этот хост неизвестен
15:32:39 [ 4]: 192.168.4.131 Этот хост неизвестен
15:32:39 [ 3]: 192.168.4.132 sh
15:32:48 [ 5]: 192.168.4.133 Этот хост неизвестен
15:32:57 [ 4]: 192.168.4.134 Этот хост неизвестен
15:32:57 [ 3]: 192.168.4.135 va
15:32:57 [ 1]: Нажмите Enter для завершения...
4 потока, 54 сек :( И ThreadPool.SetMinThreads(50, 50) никак на результат не влияет :((
Вопрос — как порулить количеством потоков для await/async (Task)?