await/async и Dns GetHostEntry()
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 02.04.14 10:54
Оценка:
Непонятная разница в количестве используемых потоков для кода с 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)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.