Hi, I work in C# 2005..

I use a separate thread to ping a computer IP and retrieve an approximate RoundtripTime.

Ping ping = new Ping();
PingReply reply = [U]ping.Send(myEP.Address);[/U]

This process takes some seconds and is ok. However my problem is that when I exit my program, it could take some seconds before actually exiting it.

Is there a way to radically end that process, maybe by generating some exception? But How? Any help please?

How are you exiting the app?

Have you tried Thread.Abort() before trying to exit your app?

I exit my application with this.Close().
I have tried Thread.Abort() but it generates a PingException which I can catch.

However, before it generates that PingException, it will still wait 4-5 secs before generating that Exception.

P.S: When working with Sockets for example: If a socket is waiting in receive mode, any socket exception (maybe by closing that socket) will have an "immediate" effect, meaning the receiving will end immediately.

You could try calling Environment.FailFast("test"); Also you should use asynchronous operations for the ping so you can terminate your thread immediately.

Here is the example from MSDN:

using System;
using System.Text;
using System.Net;
using System.Net.NetworkInformation;
using System.ComponentModel;
using System.Threading;

namespace Examples.System.Net.NetworkInformation.PingTest
    public class PingExample
        public static void Main (string[] args)
            if (args.Length == 0)
                throw new ArgumentException ("Ping needs a host or IP Address.");

            string who = args[0];
            AutoResetEvent waiter = new AutoResetEvent (false);

            Ping pingSender = new Ping ();

            // When the PingCompleted event is raised,
            // the PingCompletedCallback method is called.
            pingSender.PingCompleted += new PingCompletedEventHandler (PingCompletedCallback);

            // Create a buffer of 32 bytes of data to be transmitted.
            string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            byte[] buffer = Encoding.ASCII.GetBytes (data);

            // Wait 12 seconds for a reply.
            int timeout = 12000;

            // Set options for transmission:
            // The data can go through 64 gateways or routers
            // before it is destroyed, and the data packet
            // cannot be fragmented.
            PingOptions options = new PingOptions (64, true);

            Console.WriteLine ("Time to live: {0}", options.Ttl);
            Console.WriteLine ("Don't fragment: {0}", options.DontFragment);

            // Send the ping asynchronously.
            // Use the waiter as the user token.
            // When the callback completes, it can wake up this thread.
            pingSender.SendAsync(who, timeout, buffer, options, waiter);

            // Prevent this example application from ending.
            // A real application should do something useful
            // when possible.
            waiter.WaitOne ();
            Console.WriteLine ("Ping example completed.");

        private static void PingCompletedCallback (object sender, PingCompletedEventArgs e)
            // If the operation was canceled, display a message to the user.
            if (e.Cancelled)
                Console.WriteLine ("Ping canceled.");

                // Let the main thread resume. 
                // UserToken is the AutoResetEvent object that the main thread 
                // is waiting for.
                ((AutoResetEvent)e.UserState).Set ();

            // If an error occurred, display the exception to the user.
            if (e.Error != null)
                Console.WriteLine ("Ping failed:");
                Console.WriteLine (e.Error.ToString ());

                // Let the main thread resume. 

            PingReply reply = e.Reply;

            DisplayReply (reply);

            // Let the main thread resume.

        public static void DisplayReply (PingReply reply)
            if (reply == null)

            Console.WriteLine ("ping status: {0}", reply.Status);
            if (reply.Status == IPStatus.Success)
                Console.WriteLine ("Address: {0}", reply.Address.ToString ());
                Console.WriteLine ("RoundTrip time: {0}", reply.RoundtripTime);
                Console.WriteLine ("Time to live: {0}", reply.Options.Ttl);
                Console.WriteLine ("Don't fragment: {0}", reply.Options.DontFragment);
                Console.WriteLine ("Buffer size: {0}", reply.Buffer.Length);

Taken from: