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

本文关键字:保留 System Threading Timer 调用 函数 | 更新日期: 2023-09-27 18:15:27

我正在做一个简单的System.Threading.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();
}

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

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

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

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

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

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

我通过深度克隆WorkCheck修复了这个问题,计时器应该引用克隆表

foreach (DataRow dr in GJobList.Rows)

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