示例#1
0
        [InlineData(30000)] // 30s
        public void TimerElapsedIsRoughlyEquivalentToInterval(int interval)
        {
            const double permittedProportionUnder = -0.1;
            const double permittedProportionOver  = 0.5;
            var          elapsed   = new AutoResetEvent(false);
            IntPtr       timer     = IntPtr.Zero;
            var          stopwatch = new Stopwatch();

            TimerElapsedEventHandler handler = (sender, args) =>
            {
                if (args?.TimerId == timer)
                {
                    stopwatch.Stop();
                    elapsed.Set();
                }
            };

            SystemEvents.TimerElapsed += handler;
            try
            {
                timer = SystemEvents.CreateTimer(interval);
                stopwatch.Start();
                Assert.True(elapsed.WaitOne(interval * SystemEventsTest.ExpectedEventMultiplier));

                var proportionDifference = (double)(stopwatch.ElapsedMilliseconds - interval) / interval;
                Assert.True(permittedProportionUnder < proportionDifference && proportionDifference < permittedProportionOver,
                            $"Timer should fire less than {permittedProportionUnder * 100.0}% before and less than {permittedProportionOver * 100.0}% after expected interval {interval}, actual: {stopwatch.ElapsedMilliseconds}, difference: {proportionDifference * 100.0}%");
            }
            finally
            {
                SystemEvents.TimerElapsed -= handler;
                SystemEvents.KillTimer(timer);
            }
        }
示例#2
0
        public void ConcurrentTimers()
        {
            const int NumConcurrentTimers = 10;
            var       timersSignalled     = new Dictionary <IntPtr, bool>();
            int       numSignaled         = 0;
            var       elapsed             = new AutoResetEvent(false);

            TimerElapsedEventHandler handler = (sender, args) =>
            {
                bool signaled = false;
                lock (timersSignalled)
                {
                    if (timersSignalled.TryGetValue(args.TimerId, out signaled) && !signaled)
                    {
                        timersSignalled[args.TimerId] = true;

                        if (Interlocked.Increment(ref numSignaled) == NumConcurrentTimers)
                        {
                            elapsed.Set();
                        }
                    }
                }
            };

            SystemEvents.TimerElapsed += handler;
            try
            {
                if (PlatformDetection.IsFullFramework)
                {
                    // desktop has a bug where it will allow EnsureSystemEvents to proceed without actually creating the HWND
                    SystemEventsTest.WaitForSystemEventsWindow();
                }

                for (int i = 0; i < NumConcurrentTimers; i++)
                {
                    lock (timersSignalled)
                    {
                        timersSignalled[SystemEvents.CreateTimer(TimerInterval)] = false;
                    }
                }

                Assert.True(elapsed.WaitOne(TimerInterval * SystemEventsTest.ExpectedEventMultiplier));

                lock (timersSignalled)
                {
                    foreach (var timer in timersSignalled.Keys.ToArray())
                    {
                        Assert.True(timersSignalled[timer]);
                        SystemEvents.KillTimer(timer);
                    }
                }
            }
            finally
            {
                SystemEvents.TimerElapsed -= handler;
                elapsed.Dispose();
            }
        }
示例#3
0
        /// <summary>
        /// Extends BeginInvoke so that when a state object is not needed, null does not need to be passed.
        /// <example>
        /// timerelapsedeventhandler.BeginInvoke(sender, e, callback);
        /// </example>
        /// </summary>
        public static IAsyncResult BeginInvoke(this TimerElapsedEventHandler timerelapsedeventhandler, Object sender, TimerElapsedEventArgs e, AsyncCallback callback)
        {
            if (timerelapsedeventhandler == null)
            {
                throw new ArgumentNullException("timerelapsedeventhandler");
            }

            return(timerelapsedeventhandler.BeginInvoke(sender, e, callback, null));
        }
示例#4
0
        public void TimerElapsed()
        {
            TimerElapsedEventHandler handler = Elapsed;

            if (handler != null)
            {
                handler(ControlId, txtName.Text, txtText.Text);
            }
        }
示例#5
0
        public void ConcurrentTimers()
        {
            const int NumConcurrentTimers = 10;
            var       timersSignaled      = new ConcurrentDictionary <IntPtr, bool>();
            int       numSignaled         = 0;
            var       elapsed             = new ManualResetEventSlim();

            TimerElapsedEventHandler handler = (sender, args) =>
            {
                // A timer might fire more than once.  When it fires the first time, track it by adding
                // it to a set and then increment the number of timers that have ever fired.  When all
                // timers have fired, set the event.
                if (timersSignaled.TryAdd(args.TimerId, true) &&
                    Interlocked.Increment(ref numSignaled) == NumConcurrentTimers)
                {
                    elapsed.Set();
                }
            };

            SystemEvents.TimerElapsed += handler;
            try
            {
                if (PlatformDetection.IsFullFramework)
                {
                    // netfx has a bug where it will allow EnsureSystemEvents to proceed without actually creating the HWND
                    SystemEventsTest.WaitForSystemEventsWindow();
                }

                // Create all the timers
                var timers = new List <IntPtr>();
                for (int i = 0; i < NumConcurrentTimers; i++)
                {
                    timers.Add(SystemEvents.CreateTimer(TimerInterval));
                }

                // Wait for them all to fire
                Assert.True(elapsed.Wait(TimerInterval * SystemEventsTest.ExpectedEventMultiplier));

                // Delete them all
                foreach (IntPtr timer in timers)
                {
                    Assert.True(timersSignaled.TryGetValue(timer, out _));
                    SystemEvents.KillTimer(timer);
                }
            }
            finally
            {
                SystemEvents.TimerElapsed -= handler;
                elapsed.Dispose();
            }
        }
示例#6
0
        public void TimerElapsedSignaled()
        {
            var elapsed = new AutoResetEvent(false);

            object elapsedSender = null;
            IntPtr timer         = IntPtr.Zero;

            TimerElapsedEventHandler handler = (sender, args) =>
            {
                if (args?.TimerId == timer)
                {
                    elapsedSender = sender;
                    elapsed.Set();
                }
            };

            SystemEvents.TimerElapsed += handler;
            try
            {
                if (PlatformDetection.IsFullFramework)
                {
                    // desktop has a bug where it will allow EnsureSystemEvents to proceed without actually creating the HWND
                    SystemEventsTest.WaitForSystemEventsWindow();
                }

                timer = SystemEvents.CreateTimer(TimerInterval);

                Assert.True(elapsed.WaitOne(TimerInterval * SystemEventsTest.ExpectedEventMultiplier));
                Assert.IsType <SystemEvents>(elapsedSender);

                // Timer should fire more than once
                Assert.True(elapsed.WaitOne(TimerInterval * SystemEventsTest.ExpectedEventMultiplier));

                SystemEvents.KillTimer(timer);
                elapsed.Reset();

                // Timer should not fire once killed
                Assert.False(elapsed.WaitOne(TimerInterval * SystemEventsTest.UnexpectedEventMultiplier));
            }
            finally
            {
                SystemEvents.TimerElapsed -= handler;
                elapsed.Dispose();
            }
        }
示例#7
0
        public void ConcurrentTimers()
        {
            const int NumConcurrentTimers = 10;
            var       timersSignalled     = new Dictionary <IntPtr, bool>();
            int       numSignaled         = 0;
            var       elapsed             = new AutoResetEvent(false);

            TimerElapsedEventHandler handler = (sender, args) =>
            {
                bool signaled = false;
                if (timersSignalled.TryGetValue(args.TimerId, out signaled) && !signaled)
                {
                    timersSignalled[args.TimerId] = true;

                    if (Interlocked.Increment(ref numSignaled) == NumConcurrentTimers)
                    {
                        elapsed.Set();
                    }
                }
            };

            SystemEvents.TimerElapsed += handler;
            try
            {
                for (int i = 0; i < NumConcurrentTimers; i++)
                {
                    timersSignalled[SystemEvents.CreateTimer(TimerInterval)] = false;
                }

                Assert.True(elapsed.WaitOne(TimerInterval * SystemEventsTest.ExpectedEventMultiplier));

                foreach (var timer in timersSignalled.Keys.ToArray())
                {
                    Assert.True(timersSignalled[timer]);
                    SystemEvents.KillTimer(timer);
                }
            }
            finally
            {
                SystemEvents.TimerElapsed -= handler;
                elapsed.Dispose();
            }
        }
示例#8
0
        public void TimerElapsedSignaled()
        {
            var elapsed = new AutoResetEvent(false);

            object elapsedSender = null;
            IntPtr timer         = IntPtr.Zero;

            TimerElapsedEventHandler handler = (sender, args) =>
            {
                if (args?.TimerId == timer)
                {
                    elapsedSender = sender;
                    elapsed.Set();
                }
            };

            SystemEvents.TimerElapsed += handler;
            try
            {
                timer = SystemEvents.CreateTimer(TimerInterval);

                Assert.True(elapsed.WaitOne(TimerInterval * SystemEventsTest.ExpectedEventMultiplier));
                Assert.IsType <SystemEvents>(elapsedSender);

                // Timer should fire more than once
                Assert.True(elapsed.WaitOne(TimerInterval * SystemEventsTest.ExpectedEventMultiplier));

                SystemEvents.KillTimer(timer);
                elapsed.Reset();

                // Timer should not fire once killed
                Assert.False(elapsed.WaitOne(TimerInterval * SystemEventsTest.UnexpectedEventMultiplier));
            }
            finally
            {
                SystemEvents.TimerElapsed -= handler;
                elapsed.Dispose();
            }
        }
示例#9
0
 /// <summary>
 /// Register a function to be called when timer elapsed.
 /// </summary>
 /// /// <param name="onTimerElapsed">The TimerElapsedEventHandler function registering the flight event.</param>
 public void RegisterToTimerElapsedEvent(TimerElapsedEventHandler onTimerElapsed)
 {
     TimerEventHandler += onTimerElapsed;
 }
 public static void add_TimerElapsed(TimerElapsedEventHandler value)
 {
 }
 public static void remove_TimerElapsed(TimerElapsedEventHandler value)
 {
 }
        public static void add_TimerElapsed (TimerElapsedEventHandler value) {

        }
        public static void remove_TimerElapsed (TimerElapsedEventHandler value) {

        }