c# асинхронное выполнение методов

190
28 августа 2018, 01:20

Мне нужно постоянно пинговать около 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 он заносится в пул потоков и выполняется как в отдельном, но почему то это не заметно. Направьте что почитать. Спасибо заранее.

Answer 1

Что бы я вам посоветовал.

Напишем в каком виде нам надо получить пинг, например

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 тасков для опроса хостов. Замечу, что эти таски не выполняются в пуле потоков, так как эти таски работают с сетью, то то, чего они ожидают (ответ по сети) процессора вообще не касается. Далее я асинхронно ожидаю, когда все созданные таски завершатся - это ожидание тоже не занимает процессор. И, в конце, я перечисляю результаты.

READ ALSO
Внутренний EventBus для AspNetCore 2.0

Внутренний EventBus для AspNetCore 2.0

Здравсвуйте, нужно реализовать внутрениий EventBus (не микросервисное взаимодействие на основе например RabbitMq)Все издатели пишут на общую шину...

172
Как сократить долгую проверку на каждую букву C#

Как сократить долгую проверку на каждую букву C#

Нужно сделать проверку что бы введенное слово не содержало английских символов (f,a,g)Но простым, длинным str

168
Использование Scrypt и Bcrypt C#

Использование Scrypt и Bcrypt C#

Как использовать Scrypt или Bcrypt в C#Прошерстил несколько сайтов и форумов, но не вижу никаких объяснений, как скачать и установить библиотеку...

212