using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
using System.Collections.Generic;
using System.Net.NetworkInformation;
public static async Task Main()
var ips = new List<(string, int, int)>{
("173.194.222.139", 2, 2),
("87.250.250.242", 100, 0)
await PingWork(ips, HandlePingResults);
private static void HandlePingResults(IEnumerable<(PingReply, int, int)> pingReplyInfos)
foreach (var pingReplyInfo in pingReplyInfos)
var (pingReply, x, y) = pingReplyInfo;
Console.WriteLine(string.Format("{0} {1} at the point {2}:{3}", pingReply.Address, pingReply.Status, x, y));
private static async Task PingWork(IEnumerable<(string, int, int)> ips, Action<IEnumerable<(PingReply, int, int)>> callback)
var batchPinger = new TransformBlock<(string, int, int), (PingReply, int, int)>(PingAsync, new ExecutionDataflowBlockOptions{MaxDegreeOfParallelism = 5});
var buffer = new BufferBlock<(PingReply, int, int)>();
batchPinger.LinkTo(buffer);
foreach (var ipToCheck in ips)
await batchPinger.SendAsync(ipToCheck);
await batchPinger.Completion;
if (buffer.TryReceiveAll(out var pingResults))
private static async Task<(PingReply, int, int)> PingAsync(ValueTuple<string, int, int> payload)
var (ip, x, y) = payload;
var pingSender = new Ping();
return (await pingSender.SendPingAsync(ip), x, y);