Convert Ping application to multithreaded version to increase speed - C# Convert Ping application to multithreaded version to increase speed - C# multithreading multithreading

Convert Ping application to multithreaded version to increase speed - C#


It looks like Ping has a SendAsync function. This post (I know its vb, but just to get an idea) has an example. In summary, just change your Send to SendAsync and listen for the PingCompleted event


Well my advice is to look into your concurrency points.

Firstly you will hit a bug with any access to windows forms objects off the thread. i.e your access to button1 WILL throw an MDA in debug, and might crash at runtime randomly. You have to use a delegate and invoke the method back on the main thread using a pattern like this.

this.Invoke(delgatetomyupdatermethod)

Secondly, your time is spent in the ping itself. So I would recommend writing a threadsafe list (just write a method with a lock on it

private object locker = new object();private void InsertIntoList(string linebuffer){    lock(locker)    {        ipList.Rows.Add(linebuffer);    }}

I would recommend using the .Net threadpool to run your method instead to ping a given IP.

To do this write a function that will take in the IP to ping and to update the list with your result, then call it by queueing up items on the threadpool. Indeed if you pass in an object with a ManualResetEvent you can even write your code to say

System.Threading.WaitHandle[] waits = new System.Threading.WaitHandle[255];//initialise the list of these and create the objects to ping.foreach (var obj in mylistofobjectvalues){    System.Threading.Threadpool.QueueUserWorkItem(method, obj);}System.Threading.WaitHandle.WaitAll(waits);

where method is the ping method, obj contains an object with the manualresetevent and information your method needs to ping it's target.

Each time your waithandle completes you can update your state. With some more effort on your GUI you could even have the system working asynchronously, so that your gui is updated on each response, not just at the end.