C#定時執行。本站提示廣大學習愛好者:(C#定時執行)文章只能為提供參考,不一定能成為您想要的結果。以下是C#定時執行正文
代碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using Common.Utils; namespace test { public partial class Form1 : Form { /// <summary> /// 記載上次執行時間的文件途徑 /// </summary> private string lastRunTimePath = Path.Combine(Application.StartupPath, "lastRunTime.txt"); /// <summary> /// 上次執行時間,准確到秒 /// </summary> private string lastRunTime { get { if (File.Exists(lastRunTimePath)) { using (StreamReader sr = new StreamReader(lastRunTimePath)) { string result = sr.ReadToEnd(); sr.Close(); return result; } } return null; } set { if (!File.Exists(lastRunTimePath)) { File.Create(lastRunTimePath); } using (StreamWriter sw = new StreamWriter(lastRunTimePath, false)) { sw.Write(value); sw.Close(); } } } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); timer.Interval = 50; //定時執行的時間准確到秒,那麼Timer的時間距離要小於1秒 timer.Tick += new EventHandler((a, b) => { DateTime now = DateTime.Now; if (now.ToString("yyyy-MM-dd HH:mm:ss") != lastRunTime) //假如相等則闡明曾經執行過了 { lastRunTime = now.ToString("yyyy-MM-dd HH:mm:ss"); LogUtil.Log(now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " 時間已到,執行義務"); //TODO:在這裡執行義務 } }); timer.Start(); } } }View Code
闡明:
1、為什麼要將lastRunTime存到文件中?
這是為了順序重起的時分,仍能正確判別時間,不會反復執行。
2、和運用Windows定時義務的方式完成有什麼區別?
這也是這種完成方式的缺陷,精度不夠高,假如定時執行定時到分鐘,普通精度也只到分鐘,可以使用於關於定時時間准確水平不高的定時義務。雖然減小Interval可以進步定時精度,但消耗CPU資源。
3、為什麼要這樣完成,直接判別時分秒不就行了嗎?
順序運轉需求時間,哪怕這個時間十分短,會招致跳過某個時間,例如Interval設置為1000,也就是1秒,13時50分29.999秒執行了一次,下一次判別的時分到了13時50分31.001秒,跳過了13時50分30秒,假如秒數用等於判別,就不會執行了。
4、這只是個測試順序,實踐運用需求依據實踐狀況改造一下,比方定時到分鐘就可以了,從配置文件中讀取配置的定時時間,然後按順序中的辦法判別有沒有到這個時間。
測試日志截圖: