如何在函数被再次调用时保留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秒运行一次。
我需要的是创建定时器应该总是继续运行,当有新的工作,它只是添加另一个定时器
问题不是因为定时器行为,问题是因为每当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)