這幾天公司要寫一個定時Windows服務需要在下午一點和五點觸發,需要調用WebService接口,通過傳過來的數據下載客戶服務器上的Excel。在網上找了很多關於定時器的文章但是好多都是間隔幾分鐘觸發或者幾小時觸發。但是沒有我所需要的,然後自己找了一篇,給了我靈感,然後用到了自己的項目上。閒話不多說,直接上代碼。
Thread ReadFileThread;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
try
{
ReadFileThread = new Thread(ReadFileTimer);
ReadFileThread.Start();
}
catch (Exception e)
{
Logs.WriteTxTLogs(e.Message);
}
}
protected override void OnStop()
{
ReadFileThread.Abort();
}
private void ReadFileTimer()
{
DateTime NowTime = DateTime.Now;
DateTime time1;//定義觸發時間
try
{
if (NowTime.Hour >= 13)
{
time1 = Convert.ToDateTime(NowTime.AddDays(1).ToString("yyyy-MM-dd ") + "13:00:00");
}
else
{
time1 = Convert.ToDateTime(NowTime.ToString("yyyy-MM-dd ") + "13:00:00");
}
var timefirst = new Timer(new TimerCallback(ReadFile), null, Convert.ToInt32((time1 - NowTime).TotalMilliseconds), 24 * 3600 * 1000);
if (NowTime.Hour >= 17)
{
time1 = Convert.ToDateTime(NowTime.AddDays(1).ToString("yyyy-MM-dd ") + "17:00:00");
}
else
{
time1 = Convert.ToDateTime(NowTime.ToString("yyyy-MM-dd ") + "17:00:00");
}
var timesecond = new Timer(new TimerCallback(ReadFile), null, Convert.ToInt32((time1 - NowTime).TotalMilliseconds), 24 * 3600 * 1000);
}
catch (Exception e)
{
Logs.WriteTxTLogs("ReadFileTimer()錯誤信息:" + e);
}
}
上面是創建Timer定時器的代碼,我在ReadFileTimer方法裏創建兩個定時器,一個下午一點,另一個下午五點,每天在這兩個時間定時執行任務。這兩個定時器的主要方法是Timer,我拿一個方法說明一下:
var timefirst = new Timer(new TimerCallback(ReadFile), null, Convert.ToInt32((time1 - NowTime).TotalMilliseconds), 24 * 3600 * 1000);
Timer的參數:
第一個參數表示要調用的方法。
第二個參數是一個包含回調方法要使用的信息的對象,或者爲 null,我這裏直接寫的null。
第三個參數從代碼可以看出是當前時間到觸發時間的時間差(以毫秒爲單位),主要用於第一次觸發,若需要立即執行可寫設置爲0。如果需要調試可以設置延時觸發,延時一分鐘可以就寫60000,注意是單位毫秒要*1000。
第四個參數是調用callback的時間間隔。我這裏是一天所以寫24 * 3600 * 1000。
順便簡單說一下關於windows服務的調試。我只知道兩種方法,一是記錄日誌,而是直接調試。日誌的代碼直接放在下面,需要的自取:
/// <summary>
/// 寫文本日誌
/// </summary>
/// <param name="Message"></param>
public static void WriteTxTLogs(string Message)
{
try
{
string logfilename = "Logs.txt";
string logfilepath = @"D:\GitProject\ReadFile\ReadFile\Logs\" + logfilename;
if (File.Exists(logfilepath))
{
StreamWriter sw = new StreamWriter(logfilepath, true);
sw.WriteLine(DateTime.Now.ToString() + ":" + Message);
sw.Flush();
sw.Close();
}
else
{
StreamWriter sw = new StreamWriter(logfilepath, true);
sw.WriteLine(DateTime.Now.ToString() + ":" + Message);
sw.Flush();
sw.Close();
}
}
catch (Exception e)
{
throw;
}
}
只需改一下文本路徑,複製粘貼即可
第二種直接調試,拿我上一個定時器舉例子,設置60s(都是單身老司機手速應該沒什麼問題),如果不是單身老司機就設置值長一點,然後啓動服務,切換到VS點擊調試-附加進程-選擇自己的服務,點擊添加即可(別忘了設斷點)。
OK,在公司呆着無聊,把自己剛做完的東西寫一寫,希望對別人有幫助。拜拜,下期見。