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
就像上面的例子一样。
我这样做了:
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
就像上面的例子一样。