任务仅在Timer上运行一次

时间:2017-07-10 18:19:29

标签: c#

美好的一天,我是初学者,并试图学习如何在计时器上运行我长时间重复运行的任务。

我想要实现的是让我的方法每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。

我知道这是一个很大的问题,但我愿意学习,纠正并提出一些建议。非常感谢你。

1 个答案:

答案 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");
}

希望有所帮助!