Мне нужно постоянно пинговать около 400 машин и при это м чтобы другой функционал программы работал. Пишу так :
Task<IPStatus> tstTask(Apteka apt)
{
return Task.Run(() => {
return apt.ping();
});
}
async void tstDispRes(DataGridView dvg, List<Apteka> list)
{
for (int i = 0; i < list.Count; i++)
{
dvg[4, list[i].numPrint].Value = await tstTask(list[i]);
}
}
и после по таймеру вызываю
t2.Start();
t2.Interval = 1000;
t2.Tick += (o, v) =>
{
tstDispRes(dataGridView2, arrayOfApteka);
};
с асинхронностью все в порядке, но как мне сделать многопоточным это дело? Читал что при создание Task он заносится в пул потоков и выполняется как в отдельном, но почему то это не заметно. Направьте что почитать. Спасибо заранее.
Что бы я вам посоветовал.
Напишем в каком виде нам надо получить пинг, например
public class PingResult
{
public long RoundtripTime {get;private set;}
public IPStatus Status {get;private set;}
public PingResult(long roundtripTime, IPStatus status)
{
this.RoundtripTime = roundtripTime;
this.Status = status;
}
}
Далее, допустим, сам метод для пинга
static async Task<PingResult> Ping(string host, int timeout = 2000)
{
var ping = new Ping();
var result = await ping.SendPingAsync(host, timeout);
return new PingResult(result.RoundtripTime, result.Status);
}
Заметье, что метод Ping - асинхронный. То есть когда я его буду вызывать - не важно, сколько потоков я задействую, ожидание все равно сделаю асинхронным. То есть пока буду ждать результатов пинга процессор не будет занят вообще.
Вызывать такой код довольно просто
var hosts = Enumerable.Repeat("www.google.com", 100).ToArray();
var tasks = hosts.Select(x=>Ping(x)).ToArray();
var results = await Task.WhenAll(tasks);
foreach (var result in results)
Console.WriteLine($"{result.Status} - {result.RoundtripTime}");
Что тут происходит: сначала я создаю коллекцию из 100 хостов. Потом я запускаю 100 тасков для опроса хостов. Замечу, что эти таски не выполняются в пуле потоков, так как эти таски работают с сетью, то то, чего они ожидают (ответ по сети) процессора вообще не касается. Далее я асинхронно ожидаю, когда все созданные таски завершатся - это ожидание тоже не занимает процессор. И, в конце, я перечисляю результаты.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости