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?

7 Years
Discussion Span
Last Post by sknake

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:

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.