带有队列和System.Threading.Timer的Azure WebJob

带有队列和System.Threading.Timer的Azure WebJob,azure,webjob,Azure,Webjob,我正在使用Azure WebJob成功地从服务总线队列获取消息。 但是我想用同样的WebJob每5秒运行一些方法 我尝试了以下方法,在本地运行良好,但在发布时只运行一次。 azure日志上没有错误 我做错了什么 谢谢你的帮助 static void Main() { try { var testTimer = new System.Threading.Timer(e => TestMethod(), null, TimeSpan.Fr

我正在使用Azure WebJob成功地从服务总线队列获取消息。 但是我想用同样的WebJob每5秒运行一些方法

我尝试了以下方法,在本地运行良好,但在发布时只运行一次。 azure日志上没有错误

我做错了什么

谢谢你的帮助

   static void Main()
    {
        try
        {

    var testTimer = new System.Threading.Timer(e => TestMethod(), null, TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(5));

            SetupJobHost();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }

     private static void TestMethod()
    {
        Console.WriteLine("Test");
    }

根据您的描述,我已经测试了您的代码并在我这边复制了

经过一些测试,我发现类System.Threading.Timer有问题,如果我们在初始赋值后不引用Timer实例,那么它将被垃圾收集

请尝试以下方法以查看是否有帮助:

方法1:在调试模式下部署webjob,而不更改任何代码

方法2:按如下方式更改代码,并以发布模式将其部署到Azure

试试看
{
var testTimer=new System.Threading.Timer(e=>TestMethod(),null,TimeSpan.FromSeconds(0),TimeSpan.FromSeconds(5));
SetupJobHost();
testTimer.Dispose();
}
捕获(例外情况除外)
{
控制台写入线(ex);
}
为了更好地理解这个有趣的问题,我建议你阅读。 此外,您可以通过使用以下代码来实现您的目的:

System.Timers.Timer sysTimer=新的System.Timers.Timer(TimeSpan.FromSeconds(5).Total毫秒);
经过的系统时间+=(s,e)=>TestMethod();
sysTimer.Enabled=真;

我建议采取不同的方法,使用不同的方法。您可以使用一个简单的chron表达式,它将使您的方法按照设置的时间表执行。如果您使用此方法,请确保将WebJob部署为触发作业(非连续!),并在调用
JobHost
方法之前调用
JobHostConfiguration
UseTimers()
方法。这是一种比运行自己的计时器服务更简单、更干净的方法