1

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

我尝试了以下方法,并且在本地运行良好,但是当我发布时它只运行一次。天蓝色日志没有错误。

我究竟做错了什么?

感谢您的帮助。

   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");
    }
4

2 回答 2

1

我建议采取不同的方法并使用TimerTrigger。您可以使用一个简单的 chron 表达式,该表达式将使您的方法按设定的时间表执行。如果你走这条路,请确保将 WebJob 部署为触发作业(不是连续的!),并且在调用JobHostConfiguration'UseTimers()方法之前调用JobHost'RunAndBlock方法。这是一种比滚动您自己的计时器服务更容易和更清洁的方法。

于 2017-02-08T18:24:06.970 回答
0

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

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

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

方法一:在不更改任何代码的情况下,以调试模式部署您的 webjob;

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

try
{
    var testTimer = new System.Threading.Timer(e => TestMethod(), null, TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(5));
    SetupJobHost();
    testTimer.Dispose();
}
catch (Exception ex)
{
    Console.WriteLine(ex);
}

我建议您阅读这篇文章,以便更好地理解这个有趣的问题。此外,您可以使用以下代码来实现您的目的:

System.Timers.Timer sysTimer = new System.Timers.Timer(TimeSpan.FromSeconds(5).TotalMilliseconds);
sysTimer.Elapsed += (s, e) =>TestMethod();
sysTimer.Enabled = true;
于 2016-08-08T07:53:57.680 回答