我正在做一个简单的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秒运行一次。
我需要的是创建计时器应该始终继续运行,当有新工作时,它只是添加另一个计时器。
答案 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)
感谢您的帮助。