Export (0) Print
Expand All

ElapsedEventArgs::SignalTime Property

Gets the time the Timer::Elapsed event was raised.

Namespace:  System.Timers
Assembly:  System (in System.dll)

property DateTime SignalTime {
	DateTime get ();

Property Value

Type: System::DateTime
The time the Elapsed event was raised.

The Timer::Elapsed event is raised on a ThreadPool thread, so the event-handling method might run on one thread at the same time that a call to the Timer::Stop method runs on another thread. This might result in the Elapsed event being raised after the Stop method is called. This race condition cannot be prevented simply by comparing the SignalTime property with the time when the Stop method is called, because the event-handling method might already be executing when the Stop method is called, or might begin executing between the moment when the Stop method is called and the moment when the stop time is saved. If it is critical to prevent the thread that calls the Stop method from proceeding while the event-handling method is still executing, use a more robust synchronization mechanism such as the Monitor class or the CompareExchange method. Code that uses the CompareExchange method can be found in the example for the Timer::Stop method.

The following code example sets up an event handler for the Timer::Elapsed event, creates a timer, and starts the timer. The event handler displays the SignalTime property each time the event is raised.

#using <system.dll>

using namespace System;
using namespace System::Timers;

public ref class Timer1
   static System::Timers::Timer^ aTimer;

   static void Demo()
      // Normally, the timer is declared at the class level, 
      // so that it stays in scope as long as it is needed. 
      // If the timer is declared in a long-running method,   
      // KeepAlive must be used to prevent the JIT compiler  
      // from allowing aggressive garbage collection to occur  
      // before the method ends. You can experiment with this 
      // by commenting out the class-level declaration and  
      // uncommenting the declaration below; then uncomment 
      // the GC::KeepAlive(aTimer) at the end of the method. 
      //System::Timers::Timer^ aTimer; 

      // Create a new Timer with Interval set to 10 seconds.
      aTimer = gcnew System::Timers::Timer( 10000 );

      // Hook up the Elapsed event for the timer.
      aTimer->Elapsed += gcnew ElapsedEventHandler( Timer1::OnTimedEvent );

      // Set the Interval to 2 seconds (2000 milliseconds).
      aTimer->Interval = 2000;
      aTimer->Enabled = true;

      Console::WriteLine("Press the Enter key to exit the program.");

      // If the timer is declared in a long-running method, use 
      // KeepAlive to prevent garbage collection from occurring 
      // before the method ends. 

   // Specify what you want to happen when the Elapsed event is  
   // raised. 
   static void OnTimedEvent( Object^ source, ElapsedEventArgs^ e )
      Console::WriteLine( "The Elapsed event was raised at {0}", e->SignalTime );


int main()

/* This code example produces output similar to the following:

Press the Enter key to exit the program.
The Elapsed event was raised at 5/20/2007 8:42:27 PM
The Elapsed event was raised at 5/20/2007 8:42:29 PM
The Elapsed event was raised at 5/20/2007 8:42:31 PM

.NET Framework

Supported in: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1

.NET Framework Client Profile

Supported in: 4, 3.5 SP1
© 2015 Microsoft