I need to create an application that will ping multiple addresses in a loop. I read a lot of examples here in stackoverflow and finally got working code:
public void Check(List<string> addresses)
{
List<Task<PingReply>> pingTasks = new List<Task<PingReply>>();
foreach (string address in addresses)
{
pingTasks.Add(PingAsync(address));
}
Task.Factory.ContinueWhenAll(pingTasks.ToArray(), _ => { }).ContinueWith(t =>
{
StringBuilder pingResult = new StringBuilder();
foreach (var pingTask in pingTasks)
{
pingResult.Append(pingTask.Result.Address);
pingResult.Append(" ");
pingResult.Append(pingTask.Result.Status);
pingResult.Append(" ");
pingResult.Append(pingTask.Result.RoundtripTime.ToString());
pingResult.Append(" \n");
}
Console.WriteLine(pingResult.ToString());
},
CancellationToken.None,
TaskContinuationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
}
public static Task<PingReply> PingAsync(string address)
{
var tcs = new TaskCompletionSource<PingReply>();
using (Ping ping = new Ping())
{
ping.PingCompleted += (obj, sender) =>
{
tcs.SetResult(sender.Reply);
};
ping.SendAsync(address, new object());
}
return tcs.Task;
}
await async, . . , async , , , . , ? , while ? "" Thread.Sleep() , , - /. ping 400 1 . ?
1:
:
using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Net.NetworkInformation;
using System.Linq;
namespace Pinging
{
class CheckPing
{
public async Task LoopAndCheckPingAsync(List<string> addresses)
{
while (true)
{
var ping = new Ping();
var pingTasks = addresses.Select(address => ping.SendPingAsync(address));
await Task.WhenAll(pingTasks);
StringBuilder pingResultBuilder = new StringBuilder();
foreach (var pingReply in pingTasks)
{
pingResultBuilder.Append(pingReply.Result.Address);
pingResultBuilder.Append(" ");
pingResultBuilder.Append(pingReply.Result.Status);
pingResultBuilder.Append(" ");
pingResultBuilder.Append(pingReply.Result.RoundtripTime.ToString());
pingResultBuilder.AppendLine();
}
Console.WriteLine(pingResultBuilder.ToString());
await Task.Delay(TimeSpan.FromMinutes(5));
}
}
}
}
:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pinging
{
public class Class1
{
static void Main()
{
List<string> addresses = new List<string>() { "www.google.pl", "212.77.100.101" };
CheckPing c = new CheckPing();
Task.Factory.StartNew(() => c.LoopAndCheckPingAsync(addresses));
Console.Read();
}
}
}
LoopAndCheckPingAsync Main , . .
2:
, , :
using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Net.NetworkInformation;
using System.Linq;
namespace Pinging
{
class CheckPing
{
public async Task LoopAndCheckPingAsync(List<string> addresses)
{
while (true)
{
var pingTasks = addresses.Select(address =>
{
return new Ping().SendPingAsync(address);
});
await Task.WhenAll(pingTasks);
StringBuilder pingResultBuilder = new StringBuilder();
foreach (var pingReply in pingTasks)
{
pingResultBuilder.Append(pingReply.Result.Address);
pingResultBuilder.Append(" ");
pingResultBuilder.Append(pingReply.Result.Status);
pingResultBuilder.Append(" ");
pingResultBuilder.Append(pingReply.Result.RoundtripTime.ToString());
pingResultBuilder.AppendLine();
}
Console.WriteLine(pingResultBuilder.ToString());
Functions.counter++;
if (Functions.counter >= 100) break;
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pinging
{
public class Class1
{
static void Main()
{
List<string> addresses = Functions.Read(@"C:\Users\Adam\Desktop\addresses.csv");
Functions.start = DateTime.Now;
CheckPing c = new CheckPing();
c.LoopAndCheckPingAsync(addresses).Wait();
Console.WriteLine(Functions.counter);
Console.Read();
}
}
}
, :
www.google.com
www.yahoo.com
www.live.com
www.msn.com
www.facebook.com
www.youtube.com
www.microsoft.com
www.wikipedia.org
www.myspace.com
www.ebay.com
www.aol.com
www.ask.com
www.craigslist.org
www.blogspot.com
www.answers.com
www.about.com
www.amazon.com
www.mapquest.com
www.windows.com
www.adobe.com
www.photobucket.com
www.wordpress.com
www.go.com
www.paypal.com
www.walmart.com
www.reference.com
www.cnn.com
www.twitter.com
www.imdb.com
www.flickr.com
www.att.com
www.cnet.com
www.irs.gov
www.whitepages.com
www.yellowpages.com
www.comcast.net
www.target.com
www.simplyhired.com
www.webmd.com
www.weather.com
www.blogger.com
www.bankofamerica.com
www.apple.com
www.chase.com
www.bizrate.com
www.hulu.com
www.merriam-webster.com
www.geocities.com
www.ehow.com
www.ezinearticles.com
3:
, , . 100000 5 , . ? , ?
4:
:
System.OutOfMemoryException HResult = -2147024882 = 'System.OutOfMemoryException' . = mscorlib StackTrace: System.Exception.Init() System.InvalidOperationException..ctor( String, innerException) System.Net.NetworkInformation.PingException..ctor( String, innerException) System.Net.NetworkInformation.Ping.ContinueAsyncSend( ) System.Threading.QueueUserWorkItemCallback.WaitCallback_Context ( ) System.Threading.ExecutionContext.RunInternal(ExecutionContext executeContext, ContextCallback, , preserveSyncCtx) System.Threading.ExecutionContext.Run(ExecutionContext executeContext, ContextCallback, , preserveSyncCtx) System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() System.Threading.ThreadPoolWorkQueue.Dispatch() System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
InnerException:
5 using " ":
System.AggregateException HResult = -2146233088
= . = mscorlib StackTrace: System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) System.Threading.Tasks.Task.Wait(Int32 Timeout, CancellationToken cancelationToken) System.Threading.Tasks.Task.Wait() Pinging.Class1.Main() System.AppDomain._nExecuteAssembly ( RuntimeAssembly, String [] args) System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String [] args) Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() System.Threading.ThreadHelper.ThreadStart_Context ( ) System.Threading.ExecutionContext.RunInternal(ExecutionContext executeContext, ContextCallback, , preserveSyncCtx) System.Threading.ExecutionContext.Run(ExecutionContext executeContext, ContextCallback, , preserveSyncCtx) System.Threading.ExecutionContext.Run(ExecutionContext executeContext, ContextCallback, ) System.Threading.ThreadHelper.ThreadStart() InnerException: System.Net.NetworkInformation.PingException HResult = -2146233079 = Ping. = mscorlib : System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess( ) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification( ) System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() Pinging.CheckPing.d__2.MoveNext() InnerException: System.ApplicationException HResult = -2147024888 = ( HRESULT: 0x80070008) = mscorlib : System.Threading.ThreadPool.RegisterWaitForSingleObjectNative(WaitHandle waitHandle, , UInt32 timeOutInterval, Boolean executeOnlyOnce, RegisteredWaitHandle registeredWaitHandle, StackCrawlMark & ; stackMark, Boolean compressStack) System.Threading.ThreadPool.RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, , UInt32 TimeOutInterval, Boolean executeOnlyOnce, StackCrawlMark & stackMark, Boolean compressStack) System.Threading.ThreadPool.RegisterWaitForSingleObject(WaitHandle waitObject, WaitOrTimerCallback callBack, , Int32 TimeOutInterval, Boolean executeOnlyOnce) System.Net.NetworkInformation.Ping.InternalSend( IP-, Byte [], Int32--, PingOptions, ) System.Net.NetworkInformation.Ping.ContinueAsyncSend( ) InnerException: