我正在尝试编写一个连续的Azure WebJob,它每60秒运行一次,但不使用Azure Scheduler Service并使用System.Threading.Timer。在一般发布之前,我可以通过执行以下代码来完成它,但在恢复此项目的工作并将所有NuGet包更新到最新版本后,该作业不再以给定的间隔运行。如果我评论定时器代码并手动调用" DoWork()"方法,这不是问题。
..
const int INTERVAL_SECONDS = 60;
..
static void Main()
{
JobHost host = new JobHost();
host.Call(typeof(Program).GetMethod("StartJob"));
host.RunAndBlock();
}
[NoAutomaticTrigger]
public static void StartJob()
{
int dueTime = (int)TimeSpan.FromSeconds(INTERVAL_SECONDS).TotalMilliseconds;
Timer timer = new Timer(o => DoWork(), null, dueTime, -1);
}
public static void DoWork()
{
// Do something every XX seconds
}
WebJobs是否有任何我不知道的新变化?他们现在是否强迫每个人使用Azure Scheduler执行此类任务,或者我错过了什么?
答案 0 :(得分:1)
在经过一番挖掘后,我发现System.Threading.Timer
不是线程安全的(具有讽刺意味),我的假设是在WebJobs中引入Async支持后,在SDK中更改了一些内容以打破上述代码在我使用的预览版本和WebJobs SDK的GA版本之间。
更改上述内容以使用System.Timers.Timer
代替System.Threading.Timer
按预期方式工作:
var dueTime = TimeSpan.FromSeconds(INTERVAL_SECONDS).TotalMilliseconds;
var timer = new System.Timers.Timer(dueTime);
timer.Elapsed += (sender, e) => { DoWork(); };
timer.Start();