我在後臺每運行x分鐘運行幾個mysql查詢的web服務器應用程序中有一個方法,我搜索了一個很好的方法來完成它,並且遇到了System.Threading.Timer類。我設法編寫內部方法,並使用日誌記錄它的執行情況(每個查詢和每個異常),但是我面臨一個問題,我仍然無法理解發生了什麼,事情是什麼時候該方法需要實際做一些事情(當我在我的應用程序上有一個新記錄時,該方法將獲取它的數據並開始將其寫入我的數據庫,但只會在x分鐘運行數據時纔會執行,否則它將只運行無用)它停止,查詢或線程都沒有異常,我只是檢查日誌,並在x分鐘它應該寫在它上面的東西沒有什麼,只是殺死我的線程,我不明白什麼/爲什麼,如果有人能幫助我我會讚賞(對不起我的英文不好),這裏是代碼片段:System.Threading.Timer內的方法
using (StreamWriter sw = File.AppendText(path + @"\log_test.txt")) {
sw.WriteLineAsync("-------- LOG BEGIN --------" + Environment.NewLine);
try {
var timer = new System.Threading.Timer(async (ev) => {
bool sync = await AzureSync.Begin();
}, null, TimeSpan.Zero, TimeSpan.FromMinutes(2));
}
catch (Exception ex) {
sw.WriteLine(DateTime.Now + "**** ERROR ****" + Environment.NewLine);
sw.WriteLine(ex.ToString() + Environment.NewLine);
throw ex;
}
}
我真的不明白 - 在任何時候都寫了什麼?這個片段,誰執行它?某處,有人必須產生這個代碼。 「LOG BEGIN」行是否寫入? – Onkelborg
考慮循環等待Task.Delay(...)而不是定時器。強迫你考慮停止條件,這很好。 –
你不應該'拋出ex',它會覆蓋堆棧跟蹤。你可以用'throw;'來代替它,當它重新拋出異常時它會保留原始堆棧。 –