System.Windows.Forms.Timer反编译学习

  1 using System;
  2 using System.ComponentModel;
  3 using System.Globalization;
  4 using System.Runtime;
  5 using System.Runtime.InteropServices;
  6 using System.Threading;
  7 namespace System.Windows.Forms
  8 {
  9     [DefaultEvent("Tick"), DefaultProperty("Interval"), ToolboxItemFilter("System.Windows.Forms"), SRDescription("DescriptionTimer")]
 10     public class Timer : Component
 11     {
 12         private class TimerNativeWindow : NativeWindow
 13         {
 14             private Timer _owner;
 15             private int _timerID;
 16             private static int TimerID = 1;
 17             private bool _stoppingTimer;
 18             public bool IsTimerRunning
 19             {
 20                 get
 21                 {
 22                     return this._timerID != 0 && base.Handle != IntPtr.Zero;
 23                 }
 24             }
 25             ~TimerNativeWindow()
 26             {
 27                 this.StopTimer();
 28             }
 29             public void RestartTimer(int newInterval)
 30             {
 31                 this.StopTimer(false, IntPtr.Zero);
 32                 this.StartTimer(newInterval);
 33             }
 34             public void StartTimer(int interval)
 35             {
 36                 if (this._timerID == 0 && !this._stoppingTimer && this.EnsureHandle())
 37                 {
 38                     this._timerID = (int)SafeNativeMethods.SetTimer(new HandleRef(this, base.Handle), Timer.TimerNativeWindow.TimerID++, interval, IntPtr.Zero);
 39                 }
 40             }
 41             public void StopTimer()
 42             {
 43                 this.StopTimer(true, IntPtr.Zero);
 44             }
 45             public void StopTimer(bool destroyHwnd, IntPtr hWnd)
 46             {
 47                 if (hWnd == IntPtr.Zero)
 48                 {
 49                     hWnd = base.Handle;
 50                 }
 51                 if (this.GetInvokeRequired(hWnd))
 52                 {
 53                     UnsafeNativeMethods.PostMessage(new HandleRef(this, hWnd), 16, 0, 0);
 54                     return;
 55                 }
 56                 bool flag = false;
 57                 try
 58                 {
 59                     Monitor.Enter(this, ref flag);
 60                     if (!this._stoppingTimer && !(hWnd == IntPtr.Zero) && UnsafeNativeMethods.IsWindow(new HandleRef(this, hWnd)))
 61                     {
 62                         if (this._timerID != 0)
 63                         {
 64                             try
 65                             {
 66                                 this._stoppingTimer = true;
 67                                 SafeNativeMethods.KillTimer(new HandleRef(this, hWnd), this._timerID);
 68                             }
 69                             finally
 70                             {
 71                                 this._timerID = 0;
 72                                 this._stoppingTimer = false;
 73                             }
 74                         }
 75                         if (destroyHwnd)
 76                         {
 77                             base.DestroyHandle();
 78                         }
 79                     }
 80                 }
 81                 finally
 82                 {
 83                     if (flag)
 84                     {
 85                         Monitor.Exit(this);
 86                     }
 87                 }
 88             }
 89             public override void DestroyHandle()
 90             {
 91                 this.StopTimer(false, IntPtr.Zero);
 92                 base.DestroyHandle();
 93             }
 94             protected override void OnThreadException(Exception e)
 95             {
 96                 Application.OnThreadException(e);
 97             }
 98             public override void ReleaseHandle()
 99             {
100                 this.StopTimer(false, IntPtr.Zero);
101                 base.ReleaseHandle();
102             }
103             protected override void WndProc(ref Message m)
104             {
105                 if (m.Msg == 275)
106                 {
107                     if ((int)((long)m.WParam) == this._timerID)
108                     {
109                         this._owner.OnTick(EventArgs.Empty);
110                         return;
111                     }
112                 }
113                 else
114                 {
115                     if (m.Msg == 16)
116                     {
117                         this.StopTimer(true, m.HWnd);
118                         return;
119                     }
120                 }
121                 base.WndProc(ref m);
122             }
123             internal TimerNativeWindow(Timer owner)
124             {
125                 this._owner = owner;
126             }
127             private bool EnsureHandle()
128             {
129                 if (base.Handle == IntPtr.Zero)
130                 {
131                     CreateParams createParams = new CreateParams();
132                     createParams.Style = 0;
133                     createParams.ExStyle = 0;
134                     createParams.ClassStyle = 0;
135                     createParams.Caption = base.GetType().Name;
136                     if (Environment.OSVersion.Platform == PlatformID.Win32NT)
137                     {
138                         createParams.Parent = (IntPtr)NativeMethods.HWND_MESSAGE;
139                     }
140                     this.CreateHandle(createParams);
141                 }
142                 return base.Handle != IntPtr.Zero;
143             }
144             private bool GetInvokeRequired(IntPtr hWnd)
145             {
146                 if (hWnd != IntPtr.Zero)
147                 {
148                     int num;
149                     int windowThreadProcessId = SafeNativeMethods.GetWindowThreadProcessId(new HandleRef(this, hWnd), out num);
150                     int currentThreadId = SafeNativeMethods.GetCurrentThreadId();
151                     return windowThreadProcessId != currentThreadId;
152                 }
153                 return false;
154             }
155         }
156         private int interval;
157         private bool enabled;
158         private EventHandler onTimer;
159         private GCHandle timerRoot;
160         private Timer.TimerNativeWindow timerWindow;
161         private object userData;
162         private object syncObj = new object();
163         [SRCategory("CatBehavior"), SRDescription("TimerTimerDescr")]
164         public event EventHandler Tick
165         {
166             add
167             {
168                 this.onTimer = (EventHandler)Delegate.Combine(this.onTimer, value);
169             }
170             remove
171             {
172                 this.onTimer = (EventHandler)Delegate.Remove(this.onTimer, value);
173             }
174         }
175         [Bindable(true), DefaultValue(null), Localizable(false), TypeConverter(typeof(StringConverter)), SRCategory("CatData"), SRDescription("ControlTagDescr")]
176         public object Tag
177         {
178             [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
179             get
180             {
181                 return this.userData;
182             }
183             [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
184             set
185             {
186                 this.userData = value;
187             }
188         }
189         [DefaultValue(false), SRCategory("CatBehavior"), SRDescription("TimerEnabledDescr")]
190         public virtual bool Enabled
191         {
192             get
193             {
194                 if (this.timerWindow == null)
195                 {
196                     return this.enabled;
197                 }
198                 return this.timerWindow.IsTimerRunning;
199             }
200             set
201             {
202                 lock (this.syncObj)
203                 {
204                     if (this.enabled != value)
205                     {
206                         this.enabled = value;
207                         if (!base.DesignMode)
208                         {
209                             if (value)
210                             {
211                                 if (this.timerWindow == null)
212                                 {
213                                     this.timerWindow = new Timer.TimerNativeWindow(this);
214                                 }
215                                 this.timerRoot = GCHandle.Alloc(this);
216                                 this.timerWindow.StartTimer(this.interval);
217                             }
218                             else
219                             {
220                                 if (this.timerWindow != null)
221                                 {
222                                     this.timerWindow.StopTimer();
223                                 }
224                                 if (this.timerRoot.IsAllocated)
225                                 {
226                                     this.timerRoot.Free();
227                                 }
228                             }
229                         }
230                     }
231                 }
232             }
233         }
234         [DefaultValue(100), SRCategory("CatBehavior"), SRDescription("TimerIntervalDescr")]
235         public int Interval
236         {
237             [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
238             get
239             {
240                 return this.interval;
241             }
242             set
243             {
244                 lock (this.syncObj)
245                 {
246                     if (value < 1)
247                     {
248                         throw new ArgumentOutOfRangeException("Interval", SR.GetString("TimerInvalidInterval", new object[]
249                         {
250                             value,
251                             0.ToString(CultureInfo.CurrentCulture)
252                         }));
253                     }
254                     if (this.interval != value)
255                     {
256                         this.interval = value;
257                         if (this.Enabled && !base.DesignMode && this.timerWindow != null)
258                         {
259                             this.timerWindow.RestartTimer(value);
260                         }
261                     }
262                 }
263             }
264         }
265         public Timer()
266         {
267             this.interval = 100;
268         }
269         public Timer(IContainer container) : this()
270         {
271             if (container == null)
272             {
273                 throw new ArgumentNullException("container");
274             }
275             container.Add(this);
276         }
277         protected override void Dispose(bool disposing)
278         {
279             if (disposing)
280             {
281                 if (this.timerWindow != null)
282                 {
283                     this.timerWindow.StopTimer();
284                 }
285                 this.Enabled = false;
286             }
287             this.timerWindow = null;
288             base.Dispose(disposing);
289         }
290         protected virtual void OnTick(EventArgs e)
291         {
292             if (this.onTimer != null)
293             {
294                 this.onTimer(this, e);
295             }
296         }
297         [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
298         public void Start()
299         {
300             this.Enabled = true;
301         }
302         [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
303         public void Stop()
304         {
305             this.Enabled = false;
306         }
307         public override string ToString()
308         {
309             string str = base.ToString();
310             return str + ", Interval: " + this.Interval.ToString(CultureInfo.CurrentCulture);
311         }
312     }
313 }
View Code

以上代码是通过ILSpy反编译出来的,学习的心得如下:

1、Start和Stop方法,都是通过设置Enabled属性启用或停用定时器

2、Interval用来设置定时器的运行时间间隔

3、设置Interval注意以下代码:

 1 public int Interval
 2         {
 3             [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
 4             get
 5             {
 6                 return this.interval;
 7             }
 8             set
 9             {
10                 lock (this.syncObj)
11                 {
12                     if (value < 1)
13                     {
14                         throw new ArgumentOutOfRangeException("Interval", SR.GetString("TimerInvalidInterval", new object[]
15                         {
16                             value,
17                             0.ToString(CultureInfo.CurrentCulture)
18                         }));
19                     }
20                     if (this.interval != value)
21                     {
22                         this.interval = value;
23                         if (this.Enabled && !base.DesignMode && this.timerWindow != null)
24                         {
25                             this.timerWindow.RestartTimer(value);
26                         }
27                     }
28                 }
29             }
30         }
View Code

4、默认Timter的时间间隔为100毫秒。

1 public Timer()
2         {
3             this.interval = 100;
4         }
View Code

5、重写了ToString方法

1 public override string ToString()
2         {
3             string str = base.ToString();
4             return str + ", Interval: " + this.Interval.ToString(CultureInfo.CurrentCulture);
5         }
View Code
人生,总是有一些空城旧事,年华未央;总是有些季节,一季花凉,满地忧伤。许多事,看开了,便会峰回路转;许多梦,看淡了,便会云开日出。学会思索,学会珍藏,微笑领悟,默默坚强。
原文地址:https://www.cnblogs.com/yuzhou133/p/4139274.html