我在后台每运行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;'来代替它,当它重新抛出异常时它会保留原始堆栈。 –