解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
4.19 KiB
X
# TimerX ʹÓÃÊÖ²á `NewLife.Threading.TimerX` ÊÇÒ»¸ö²»¿ÉÖØÈëµÄ¶¨Ê±Æ÷ʵÏÖ£¬Ö§³ÖºÁÃëÖÜÆÚ¡¢¾ø¶Ôʱ¼ä¶ÔÆë¡¢ÒÔ¼° Cron ±í´ïʽµ÷¶È¡£ - Ô´Â룺`NewLife.Core\Threading\TimerX.cs` - ÃüÃû¿Õ¼ä£º`NewLife.Threading` --- ## 1. ÊÊÓó¡¾° - ÐèÒª±ÜÃâϵͳ `Timer` Ôڻص÷ºÄʱ½Ï³¤Ê±µÄ¡°²¢·¢ÖØÈ롱 - ÐèÒªÒÔ¡°ÈÎÎñÖ´ÐнáÊø¡±Îª»ù×¼¼ÆËãÏÂÒ»´Î¼ä¸ô - ÐèÒªÒԹ̶¨Ê±¿Ì¶ÔÆë£¨¾ø¶Ôʱ¼ä£©Ö´ÐÐ - ÐèÒª»ùÓÚ Cron ±í´ïʽִÐУ¨¿É¶à¸ö±í´ïʽȡ×î½ü´¥·¢£© > ×¢Ò⣺`TimerX` »á±» `TimerScheduler` ³ÖÓУ¨¹ÒÔÚ¾²Ì¬ÁбíÉÏ£©¡£ÓÃÍê±ØÐë `Dispose()`£¬·ñÔò¿ÉÄܵ¼Ö¶ÔÏó³¤ÆÚ´æ»îÓëÈÎÎñ³ÖÐøÖ´ÐС£ --- ## 2. ºËÐĸÅÄî ### 2.1 ²»¿ÉÖØÈë `TimerX` µÄµ÷¶È²ßÂÔÊÇ¡°»Øµ÷Ö´ÐÐÍê±ÏºóÔÙ¼ÆËãÏÂÒ»´Î¼ä¸ô¡±£¬´Ó¸ùÔ´ÉϱÜÃâ²¢ÐÐÖØÈë¡£ ### 2.2 µ÷¶È»ù×¼£¨Tick£©Óëʱ¼ä»Ø²¦ `TimerX` ʹÓà `Runtime.TickCount64` ×÷Ϊµ÷¶È»ù×¼£¬Í¨¹ý `_baseTime + _nextTick` Ó³Éäµ½ `NextTime`£º - Óŵ㣺²»ÊÜϵͳʱ¼ä»Ø²¦Ó°Ï죨Ïà¶ÔʱÖÓ£© - ÿ´Î `SetNextTick` »áˢР`_baseTime = Scheduler.GetNow() - tick`£¬¼õÉÙÆ¯ÒÆ ### 2.3 ¾ø¶Ôʱ¼äÓë Cron - `Absolutely=true`£º°´¡°¾ø¶Ôʱ¼äµã¡±Ö´ÐУ¨Óë `SetNext` Î޹أ© - Cron ¹¹Ô캯Êý»á×Ô¶¯¿ªÆô `Absolutely=true`£¬²¢Í¨¹ý `Cron.GetNext(now)` ¼ÆËãÏÂÒ»´Î´¥·¢ --- ## 3. ¹¹Ô캯ÊýÓëÓ÷¨ ### 3.1 ÆÕͨÖÜÆÚ¶¨Ê±Æ÷£¨ºÁÃ룩 ```csharp var timer = new TimerX(_ => { // ͬ²½»Øµ÷ }, state: null, dueTime: 1000, period: 5000); // ...ʹÓÃ... timer.Dispose(); ``` ²ÎÊýº¬Ò壺 - `dueTime`£ºÊ×´ÎÑÓ³Ù£¨ºÁÃ룩 - `period`£ººóÐøÖÜÆÚ£¨ºÁÃ룩£»`0` »ò `-1` ±íʾִֻÐÐÒ»´Î ### 3.2 Òì²½ÖÜÆÚ¶¨Ê±Æ÷ ```csharp var timer = new TimerX(async _ => { await Task.Delay(100); }, state: null, dueTime: 1000, period: 5000); ``` ¸Ã¹¹Ô캯Êý»á×Ô¶¯ÉèÖ㺠- `IsAsyncTask = true` - `Async = true` ### 3.3 ¾ø¶Ôʱ¼ä¶¨Ê±Æ÷£¨¶ÔÆëµ½¹Ì¶¨Ê±¼äµã£© ```csharp var start = DateTime.Today.AddHours(2); var timer = new TimerX(_ => { // ÿÌì 02:00 Ö´ÐÐ }, state: null, startTime: start, period: 24 * 3600 * 1000); ``` ÌØµã£º - Èô `startTime` ÔçÓÚµ±Ç°Ê±¼ä£¬»á²»¶Ï¼Ó `period` Ö±µ½´óÓÚµ±Ç°Ê±¼ä - Êʺϡ°ÕûµãÖ´ÐÐ/¹Ì¶¨Ê±¿ÌÖ´ÐС±µÄÐèÇó ### 3.4 Cron ¶¨Ê±Æ÷£¨Ö§³Ö¶à¸ö±í´ïʽ£© ```csharp var timer = new TimerX(_ => { // ÒµÎñÂß¼­ }, state: null, cronExpression: "0 0 2 * * 1-5;0 0 3 * * 6"); ``` ¹æÔò£º - ¶à±í´ïʽÓà `;` ·Ö¸ô - ÄÚ²¿»á½âÎöΪ `Cron[]`£¨`Crons` ÊôÐԿɶÁ£© - ÏÂÒ»´ÎÖ´ÐÐʱ¼äÈ¡ `Min(cron.GetNext(now))` Òì²½ Cron£º ```csharp var timer = new TimerX(async _ => { await Task.Delay(100); }, state: null, cronExpression: "0 */1 * * * *"); ``` --- ## 4. ÖØÒªÊôÐÔ/·½·¨ ### 4.1 ¹Ø¼üÊôÐÔ - `Int32 Id`£º¶¨Ê±Æ÷±àºÅ£¬Óɵ÷¶ÈÆ÷·ÖÅä - `TimerScheduler Scheduler`£ºËùÊôµ÷¶ÈÆ÷ - `Object? State`£ºÓû§Êý¾Ý£¨ÈõÒýÓô洢£© - `Int32 Period`£ºÖÜÆÚºÁÃëÊý - `Boolean Async`£ºÊÇ·ñÒì²½Ö´ÐÐÈÎÎñ - `Boolean Absolutely`£ºÊÇ·ñ°´¾ø¶Ôʱ¼äÖ´ÐÐ - `Cron[]? Crons`£ºCron ±í´ïʽ¼¯ºÏ£¨Cron ģʽ²ÅÓУ© - `DateTime NextTime` / `Int64 NextTick`£ºÏÂÒ»´Îµ÷¶Èʱ¼ä£¨·Ö±ðÊÇʵ¼Êʱ¼ä / tick£© > `State` ʹÓà `WeakReference` ±£´æ£ºÈç¹ûµ÷Ó÷½Î´³ÖÓÐ `State` ÒýÓ㬿ÉÄܱ» GC »ØÊÕ¡£ ### 4.2 ÉèÖÃÏÂÒ»´ÎÖ´ÐУº`SetNext` `SetNext(Int32 ms)` ¿ÉÒÔÊÖ¹¤ÉèÖÃÏÂÒ»´ÎÖ´ÐÐʱ¼ä£¨Ïà¶Ôµ±Ç° tick£©£¬²¢»½Ðѵ÷¶ÈÆ÷£º ```csharp timer.SetNext(500); ``` ×¢Ò⣺ - ½öÓ°Ïì¡°ÆÕͨÖÜÆÚ¶¨Ê±Æ÷¡±Â·¾¶£¨¼´ `Absolutely=false` ÇÒ·Ç Cron£©¸ü·ûºÏÖ±¾õ - `Absolutely=true`/Cron µÄÏÂÒ»´Îʱ¼äÓÉÄÚ²¿¾ø¶Ôʱ¼ä¼ÆËãÂß¼­¾ö¶¨ ### 4.3 ÐÞ¸ÄÖÜÆÚ£º`Change` `Change(TimeSpan dueTime, TimeSpan period)` ½ö¶Ô¡°ÆÕͨÖÜÆÚ¶¨Ê±Æ÷¡±ÓÐЧ£º - Èô `Absolutely=true`£¬·µ»Ø `false` - Èô´æÔÚ `Crons`£¬·µ»Ø `false` ```csharp var ok = timer.Change(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5)); ``` --- ## 5. ¹Ø¼üÐÐΪ˵Ã÷£¨±ÜÃâ²È¿Ó£© ### 5.1 ±ØÐë `Dispose` `TimerX` ʵÀý»á±» `TimerScheduler` ÒýÓᣠ- ²» `Dispose`£º¿ÉÄܵ¼Ö¶¨Ê±Æ÷Ò»Ö±´æÔÚ²¢³ÖÐø´¥·¢ - ÍÆ¼ö£ºÓà `using var timer = ...` »ò·Åµ½ËÞÖ÷ÉúÃüÖÜÆÚÀïͳһÊÍ·Å ### 5.2 Cron ÏÂÒ»´Îʱ¼ä¹ý½üµÄ´¦Àí ÔÚ `SetAndGetNextTime` µÄ Cron ·ÖÖ§ÖУº - ÏÈËã `next = Min(GetNext(now))` - Èô `(next - now) < 1000ms`£¬ÔòÔÙËãÒ»´Î `GetNext(next)` Ä¿µÄ£º±ÜÃâ¡°¸ÕºÃÃüÖÐ/¹ý½ü¡±µ¼ÖÂÖØ¸´´¥·¢¡£ ### 5.3 ÈÎÎñ²»ÒªÌ«¶à `TimerX` µÄÉè¼ÆÊʺÏÉÙÁ¿¸ß¼ÛÖµ¶¨Ê±ÈÎÎñ¡£ - Èç¹û¹ÒÔØ´óÁ¿ÈÎÎñ£¬µ¥¸öµ÷¶ÈÆ÷Ï߳̿ÉÄÜ»á³ÉΪƿ¾± - ¸´ÔÓµ÷¶È½¨ÒéÉϲ㹹½¨ÈÎÎñ¶ÓÁУ¬»Øµ÷ÖнöͶµÝ£¬²»×öÖØ»î --- ## 6. ʾÀýÓë²âÊԲο¼ ²Ö¿âÄڿɲο¼²âÊÔ£º - `XUnitTest.Core\Threading\TimerXTests.cs` - `NormalTest`£ºÆÕͨÖÜÆÚ - `AsyncTest`£ºÒì²½»Øµ÷ - `AbsolutelyTest`£º¾ø¶Ôʱ¼ä - `CronTest`£ºCron ±í´ïʽ£¨º¬¶à±í´ïʽ `;`£© --- ## 7. Ïà¹ØÁ´½Ó - Îĵµ£º<https://newlifex.com/core/timerx>