【发布时间】:2017-09-25 17:39:50
【问题描述】:
我在 Web 服务器应用程序中有一个方法,它每 x 分钟在后台运行几个 mysql 查询,我搜索了一个很好的方法并遇到了 System.Threading.Timer 类。我设法在内部对方法进行编码并使用日志来跟踪它的执行(每个查询和每个异常),但是我面临一个问题,我仍然无法理解发生了什么,问题是该方法何时需要实际做某事(当我在我的应用程序上有一条新记录时,该方法将获取它的数据并开始将其写入我的数据库,但它只会在它运行的那个 x 分钟内执行此操作,否则它只会运行什么都不做)它停止了,查询或线程都没有例外,我只是检查日志,在 x 分钟它应该在上面写一些东西,根本什么都没有,有些东西只是杀死了我的线程,我不明白是什么/为什么,如果有人可以帮助我,我会很感激(对不起我的英语不好),这里是代码 sn-p:
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;
}
}
【问题讨论】:
-
我真的不明白 - 任何时候都写过什么吗?这个sn-p,谁来执行?在某个地方,必须有人生成此代码。 “LOG BEGIN”这行写完了吗?
-
考虑循环等待 Task.Delay(...) 而不是计时器。迫使您考虑停止条件,这很好。
-
你不应该这样做
throw ex,它会覆盖堆栈跟踪。你可以改用throw;,它会在重新抛出异常时保留原始堆栈。
标签: c# asp.net .net multithreading timer