2010-04-06 Jb Evain <jbevain@novell.com>
[mcs.git] / class / WindowsBase / System.Windows.Threading / DispatcherTimer.cs
blob1068b833e021d8e5d3b08d21421feba00b4a67e4
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 //
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 //
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2006 Novell, Inc. (http://www.novell.com)
22 // Authors:
23 // Miguel de Icaza (miguel@novell.com)
25 using System;
26 using System.Collections;
27 using System.Threading;
29 namespace System.Windows.Threading {
31 public class DispatcherTimer {
32 DispatcherPriority priority;
33 Dispatcher target_dispatcher;
34 long interval;
35 EventHandler callback;
36 Timer timer;
37 object tag;
39 public DispatcherTimer ()
40 : this (DispatcherPriority.Background, Dispatcher.CurrentDispatcher)
44 public DispatcherTimer (DispatcherPriority priority)
45 : this (priority, Dispatcher.CurrentDispatcher)
49 public DispatcherTimer (DispatcherPriority priority, Dispatcher dispatcher)
50 : this (TimeSpan.Zero, priority, null, dispatcher)
54 public DispatcherTimer (TimeSpan interval, DispatcherPriority priority,
55 EventHandler callback, Dispatcher dispatcher)
57 this.priority = priority;
58 this.target_dispatcher = dispatcher;
59 this.interval = interval.Ticks;
60 this.callback = callback;
63 public void Start ()
65 if (timer == null){
66 long repeat_interval = interval;
67 if (repeat_interval == 0)
68 repeat_interval = 1;
69 timer = new Timer (new TimerCallback (timer_tick), null, interval, repeat_interval);
73 void timer_tick (object state)
75 target_dispatcher.BeginInvoke (priority, (ThreadStart) delegate {
76 EventHandler h = Tick;
77 if (h != null)
78 h (this, EventArgs.Empty);
79 if (callback != null)
80 callback (this, EventArgs.Empty);
81 });
84 public void Stop ()
86 if (timer == null)
87 return;
89 timer.Dispose ();
90 timer = null;
93 public Dispatcher Dispatcher {
94 get {
95 return target_dispatcher;
99 public TimeSpan Interval {
100 get {
101 return new TimeSpan (interval);
104 set {
105 if (interval == value.Ticks)
106 return;
108 interval = value.Ticks;
110 if (timer != null)
111 timer.Change (interval, interval);
115 public bool IsEnabled {
116 get {
117 return timer != null;
120 set {
121 if (value && timer == null)
122 Start ();
123 if (value == false && timer != null)
124 Stop ();
128 public object Tag {
129 get {
130 return tag;
133 set {
134 tag = value;
137 public event EventHandler Tick;