Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 4272826
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 21, 20262026-05-21T07:37:48+00:00 2026-05-21T07:37:48+00:00

I created a simple System.Timers.Timer in my Init() method like so: Init() dataUpdateTimer =

  • 0

I created a simple System.Timers.Timer in my Init() method like so:

Init()

        dataUpdateTimer = new Timer(DATA_POLLING_TIME);
        dataUpdateTimer.Elapsed += new ElapsedEventHandler(UpdateTimer_Elapsed);
        dataUpdateTimer.Enabled = true;

I want to properly uninitialize it. How do I do so? The following is what I have but sometimes the handler method is called after unitialization:

Uninit()

        if (null != dataUpdateTimer)
        {
            dataUpdateTimer.Close();
            dataUpdateTimer.Enabled = false; 
        }

Do I need to remove the handler?

Thanks.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-21T07:37:49+00:00Added an answer on May 21, 2026 at 7:37 am

    I don’t think there is a guarantee that your handler will not be called in the millisecond after you tell it to be disabled so you could set a flag to ensure that if that flag is set, then do no more processing. However, if the Timer is already processing it will continue until the next iteration.

    On MSDN, it has this to say:

    The event-handling method might run on
    one thread at the same time that
    another thread calls the Stop method
    or sets the Enabled property to false.
    This might result in the Elapsed event
    being raised after the timer is
    stopped. The example code for the Stop
    method shows one way to avoid this
    race condition.

    From the MSDN page on Stop:

    using System;
    using System.Timers;
    using System.Threading;
    
    public class Test
    {    
        // Change these values to control the behavior of the program.
        private static int testRuns = 100;
        // Times are given in milliseconds:
        private static int testRunsFor = 500;
        private static int timerIntervalBase = 100;
        private static int timerIntervalDelta = 20;
    
        // Timers.
        private static System.Timers.Timer Timer1 = new System.Timers.Timer();
        private static System.Timers.Timer Timer2 = new System.Timers.Timer();
        private static System.Timers.Timer currentTimer = null;
    
        private static Random rand = new Random();
    
        // This is the synchronization point that prevents events
        // from running concurrently, and prevents the main thread 
        // from executing code after the Stop method until any 
        // event handlers are done executing.
        private static int syncPoint = 0;
    
        // Count the number of times the event handler is called,
        // is executed, is skipped, or is called after Stop.
        private static int numEvents = 0;
        private static int numExecuted = 0;
        private static int numSkipped = 0;
        private static int numLate = 0;
    
        // Count the number of times the thread that calls Stop
        // has to wait for an Elapsed event to finish.
        private static int numWaits = 0;
    
        [MTAThread]
        public static void Main()
        {
            Timer1.Elapsed += new ElapsedEventHandler(Timer1_ElapsedEventHandler);
            Timer2.Elapsed += new ElapsedEventHandler(Timer2_ElapsedEventHandler);
    
            Console.WriteLine();
            for(int i = 1; i <= testRuns; i++)
            {
                TestRun();
                Console.Write("\rTest {0}/{1}    ", i, testRuns);
            }
    
            Console.WriteLine("{0} test runs completed.", testRuns);
            Console.WriteLine("{0} events were raised.", numEvents);
            Console.WriteLine("{0} events executed.", numExecuted);
            Console.WriteLine("{0} events were skipped for concurrency.", numSkipped);
            Console.WriteLine("{0} events were skipped because they were late.", numLate);
            Console.WriteLine("Control thread waited {0} times for an event to complete.", numWaits);
        }
    
        public static void TestRun()
        {
            // Set syncPoint to zero before starting the test 
            // run. 
            syncPoint = 0;
    
            // Test runs alternate between Timer1 and Timer2, to avoid
            // race conditions between tests, or with very late events.
            if (currentTimer == Timer1)
                currentTimer = Timer2;
            else
                currentTimer = Timer1;
    
            currentTimer.Interval = timerIntervalBase 
                - timerIntervalDelta + rand.Next(timerIntervalDelta * 2);
            currentTimer.Enabled = true;
    
            // Start the control thread that shuts off the timer.
            Thread t = new Thread(ControlThreadProc);
            t.Start();
    
            // Wait until the control thread is done before proceeding.
            // This keeps the test runs from overlapping.
            t.Join();
    
        }
    
    
        private static void ControlThreadProc()
        {
            // Allow the timer to run for a period of time, and then 
            // stop it.
            Thread.Sleep(testRunsFor);
            currentTimer.Stop();
    
            // The 'counted' flag ensures that if this thread has
            // to wait for an event to finish, the wait only gets 
            // counted once.
            bool counted = false;
    
            // Ensure that if an event is currently executing,
            // no further processing is done on this thread until
            // the event handler is finished. This is accomplished
            // by using CompareExchange to place -1 in syncPoint,
            // but only if syncPoint is currently zero (specified
            // by the third parameter of CompareExchange). 
            // CompareExchange returns the original value that was
            // in syncPoint. If it was not zero, then there's an
            // event handler running, and it is necessary to try
            // again.
            while (Interlocked.CompareExchange(ref syncPoint, -1, 0) != 0)
            {
                // Give up the rest of this thread's current time
                // slice. This is a naive algorithm for yielding.
                Thread.Sleep(1);
    
                // Tally a wait, but don't count multiple calls to
                // Thread.Sleep.
                if (!counted)
                {
                    numWaits += 1;
                    counted = true;
                }
            }
    
            // Any processing done after this point does not conflict
            // with timer events. This is the purpose of the call to
            // CompareExchange. If the processing done here would not
            // cause a problem when run concurrently with timer events,
            // then there is no need for the extra synchronization.
        }
    
    
        // Event-handling methods for the Elapsed events of the two
        // timers.
        //
        private static void Timer1_ElapsedEventHandler(object sender, 
            ElapsedEventArgs e)
        {
            HandleElapsed(sender, e);
        }
    
        private static void Timer2_ElapsedEventHandler(object sender, 
            ElapsedEventArgs e)
        {
            HandleElapsed(sender, e);
        }
    
        private static void HandleElapsed(object sender, ElapsedEventArgs e)
        {
            numEvents += 1;
    
            // This example assumes that overlapping events can be
            // discarded. That is, if an Elapsed event is raised before 
            // the previous event is finished processing, the second
            // event is ignored. 
            //
            // CompareExchange is used to take control of syncPoint, 
            // and to determine whether the attempt was successful. 
            // CompareExchange attempts to put 1 into syncPoint, but
            // only if the current value of syncPoint is zero 
            // (specified by the third parameter). If another thread
            // has set syncPoint to 1, or if the control thread has
            // set syncPoint to -1, the current event is skipped. 
            // (Normally it would not be necessary to use a local 
            // variable for the return value. A local variable is 
            // used here to determine the reason the event was 
            // skipped.)
            //
            int sync = Interlocked.CompareExchange(ref syncPoint, 1, 0);
            if (sync == 0)
            {
                // No other event was executing.
                // The event handler simulates an amount of work
                // lasting between 50 and 200 milliseconds, so that
                // some events will overlap.
                int delay = timerIntervalBase 
                    - timerIntervalDelta / 2 + rand.Next(timerIntervalDelta);
                Thread.Sleep(delay);
                numExecuted += 1;
    
                // Release control of syncPoint.
                syncPoint = 0;
            }
            else
            {
                if (sync == 1) { numSkipped += 1; } else { numLate += 1; }
            }
        }
    }
    
    /* On a dual-processor computer, this code example produces
       results similar to the following:
    
    Test 100/100    100 test runs completed.
    436 events were raised.
    352 events executed.
    84 events were skipped for concurrency.
    0 events were skipped because they were late.
    Control thread waited 77 times for an event to complete.
     */
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I created a simple hello-wordish code using hibernate sf = new Configuration().configure().buildSessionFactory(); System.out.println(sessionFactory is
I created a simple login system using sql It has 4 main components index
I just created a simple project in VS2010, C# dotnet 3.5 using System; using
I need to create a simple Chat system like facebook chat and a twitter-like
I am new to Repository concept and get some questions. I have created simple
I created a simple Java EE project in NetBeans (File -> New Project ->
Need guidance on best practice for implementing a simple quota system I'd like to
i would like to create a pretty simple combat system in JQuery, for a
I have a process, which creates a dynamic list of timers(System.Threading.Timer) and continues to
I created a simple log in system, and i used CI Sessions for holding

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.