解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# 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>
|