美好的一天,我是初学者,并试图学习如何在计时器上运行我长时间重复运行的任务。
我想要实现的是让我的方法每100毫秒运行一次。 (如果出现问题,请纠正我)
private void Long_Running_Task()
{
DateTime timeticking = DateTime.Now;
using (MySqlConnection ccon = new MySqlConnection(connString))
{
ccon.Open();
MySqlCommand ccom = new MySqlCommand("Select * From table1", ccon);
MySqlDataReader creader = ccom.ExecuteReader();
while (creader.HasRows && creader.Read())
{
string etime = creader.GetString(creader.GetOrdinal("Time"));
string etimeformat = creader.GetString(creader.GetOrdinal("TimeFormat"));
string edate = creader.GetString(creader.GetOrdinal("Date"));
DateTime tdate = Convert.ToDateTime(edate);
var newedate = todatetime.ToString("yyyy/MM/dd");
string expected_datetime_for_report = newedate + " " + etime + " " + etimeformat;
var selecttimeticking = timeticking.ToString("yyyy/MM/dd hh:mm tt");
if (selecttimeticking == expected_datetime_for_report)
{
using (MySqlConnection ccon2 = new MySqlConnection(connString))
{
MySqlCommand ccom2 = new MySqlCommand();
string completes = "Complete";
ccon2.Open();
ccom2 = new MySqlCommand("UPDATE table1 SET Report_Progress=@reportstatus WHERE Date=@day && Time=@time && TimeFormat=@timeformat", ccon2);
ccom2.Parameters.AddWithValue("@day", newexpecteddate);
ccom2.Parameters.AddWithValue("@time", expectedtime);
ccom2.Parameters.AddWithValue("@timeformat", expectedtimeformat);
ccom2.Parameters.AddWithValue("@reportstatus", completes);
ccom2.ExecuteReader();
ccon2.Close();
}
}
}
creader.Dispose();
ccon.Close();
}
}
当涉及到该方法的功能时,它正在执行应该执行的操作,但在我在计时器上尝试时只运行一次。
private void Time_Tick(object sender, EventArgs e)
{
Task longrun = new Task(()=>Long_Running_Task());
longrun.Start();
}
当我把我的方法的代码放到我的计时器时#34; Time_Tick"它会一次又一次地运行,只有一个问题,当我在我所选择的日期运行大量数据时,它会滞后,例如10/07/2017 11:30 PM。
我知道这是一个很大的问题,但我愿意学习,纠正并提出一些建议。非常感谢你。
答案 0 :(得分:0)
就个人而言,当遇到这样的问题时,如果以前的实例正在运行,我通常会通过让函数不被启动来解决它。这是一个很好的课程,可以帮助你解决这个问题:
public class RecurringTask
{
private Action procedureToRunRepeatedly;
private Timer timer;
private Task task;
public RecurringTask(Action procedureToRunRepeatedly, int millisecondsBetweenRuns)
{
this.procedureToRunRepeatedly = procedureToRunRepeatedly;
this.timer = new Timer();
this.timer.Tick += TickEvent;
this.timer.Interval = millisecondsBetweenRuns;
this.timer.Enabled = true;
}
private void TickEvent(object sender, EventArgs e)
{
if (task != null)
if (task.Status == TaskStatus.Running) return;
task = new Task(procedureToRunRepeatedly);
task.Start();
}
}
基本上,您所要做的就是创建一个RecurringTask实例,输入您希望它执行的Action,以及调用之间需要多少毫秒。如果任务仍然在下一个“勾选”时运行。发生时,它只是退出并等待下一个滴答。
在我的示例中,我只是做了一些愚蠢的事情:
private RecurringTask myTask = new RecurringTask(DoTest, 2000);
public void DoTest()
{
MessageBox.Show("Hello World");
}
希望有所帮助!