如何在再次调用函数时保留System.Threading.Timer

时间:2015-09-30 08:13:58

标签: c# multithreading timer

我正在做一个简单的System.Threading.Timer测试,因为我想在我的窗口服务中使用它。我遇到的问题是当我再次调用Timer所在的函数时,现有的运行时间将会消失,我该如何保存它?

班级档案: -

namespace Worker
{
 public class ProcessingWork
 {
    public void testTimer()
    {
        DataTable WorkCheck = getNewWork(); // Get new work from Database if there is any
        foreach (DataRow dr in WorkCheck.Rows)
        {
            if (dr["IsNew"] == "true")
            {                   
                Timer JobTimer = new Timer(timer =>
                {
                    try
                    {
                        Console.WriteLine("id is " + Convert.ToInt32(dr["WorkID"]).ToString());
                        int WorkID = Convert.ToInt32(dr["WorkID"]);

                        if (WorkID != 0)
                        {
                            Console.WriteLine(DateTime.Now + " | Running " + WorkID);
                            ((Timer)timer).Change(TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(999));
                        }                       
                    }
                    catch (Exception ex)
                    {
                        //Log
                    }
                });
                JobTimer.Change(0, 0);
            }
        }
    }
 }
}

计划主要: -

class Program 
{
    static void Main(string[] args)
    {
        Thread[] WorkerThread = new Thread[1];
        ProcessingWork pw = new ProcessingWork();            
        WorkerThread[0] = new Thread(() =>
        {
            int i = 0;
            while (true)
            {
                Console.WriteLine("Running " + i);
                pw.testTimer();
                Thread.Sleep(10000);
                i++;
            }
        })
        {
            Name = "Test"
        };
        WorkerThread[0].Start();
}

我对此代码的目标是允许每次重复。当我再次调用我的Thread运行的函数并调用pw.tesTimer()时,它将检查数据库是否需要处理任何新工作。如果有,它将为工作创建另一个计时器。

我面临的问题是当我再次呼叫pw.testTimer();时,所有正在运行的计时器将停止并消失。我尝试没有重新调用pw.testTimer();时间将像我设置的那样每2秒运行一次。

我需要的是创建计时器应该始终继续运行,当有新工作时,它只是添加另一个计时器。

1 个答案:

答案 0 :(得分:0)

问题不在于Timer的行为,问题是因为只要WorkCheck表被编辑,之前创建的Timer就无法引用该值,因此定时器将中止。

例如在运行的计时器Convert.ToInt32(dr["WorkID"]); //Value 1中,因为我通过DataTable WorkCheck = getNewWork();更新表。当没有新数据时,行将为空,最终它将重写表,因此第一个timer正在引用值1,但现在值为0.因此它会导致运行计时器中止。

我通过Deep Cloning WorkCheck解决了这个问题,计时器应该引用克隆表

foreach (DataRow dr in GJobList.Rows)

 foreach (DataRow dr in GJobList.DeepClone().Rows)

感谢您的帮助。