• 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
    人生,总是有一些空城旧事,年华未央;总是有些季节,一季花凉,满地忧伤。许多事,看开了,便会峰回路转;许多梦,看淡了,便会云开日出。学会思索,学会珍藏,微笑领悟,默默坚强。
  • 相关阅读:
    CSP内容安全策略总结及如何抵御 XSS 攻击
    CORS跨域资源共享总结
    web安全总结
    小知识随手记(八)
    内存泄漏问题总结
    Vue中插槽slot的使用
    Git常用命令、及常见报错处理:You have not concluded your merge (MERGE_HEAD exists)、清理无效的远程追踪分支
    render函数、createElement函数与vm.$slots
    Redis集群(二):Redis的安装
    Shell命令_文件系统常用命令df、du
  • 原文地址:https://www.cnblogs.com/yuzhou133/p/4139274.html
Copyright © 2020-2023  润新知