Ping 多线程

Ping with multithreading

我这样做了:

WebClient client = new WebClient();
string[] dns = client.DownloadString("https://public-dns.info/nameservers.txt")
    .Split('\n');
List<string> parsedDns = new List<string>();
foreach (string dnsStr in dns)
{
    Ping ping = new Ping();
    if (dnsStr.Contains(":"))
    {

    }
    else if (ping.SendPingAsync(dnsStr, 150).Result.RoundtripTime <= 150)
    {
        parsedDns.Add(dnsStr);
    }
}

foreach (var dns_ in parsedDns.ToArray())
{
   Console.WriteLine(dns_);
}
Console.ReadKey();

它所做的是收集一个页面的 DNS,将它们放在一个 string[] 中,然后一个一个地 ping 它们,那些响应时间少于 150 毫秒的将被保存并打印在控制台上。我试着用多线程来做,但它一直给我错误,我想知道如何使用例如 500 个线程没有任何错误来提高这个过程的速度。

您可以使用 .NET 6 中引入的 Parallel.ForEachAsync API。

var parsedDns = new ConcurrentQueue<string>();
var options = new ParallelOptions() { MaxDegreeOfParallelism = 10 };

Parallel.ForEachAsync(dns, options, async (dnsStr, ct) =>
{
    Ping ping = new();
    PingReply reply = await ping.SendPingAsync(dnsStr, 150);
    if (reply.RoundtripTime <= 150)
    {
        parsedDns.Enqueue(dnsStr);
    }
}).Wait();

Parallel.ForEachAsync 方法 returns 一个 Task 你可以 await 或者简单地 Wait 就像上面的例子一样。