如何在foreach循环中使用计时器

时间:2014-04-07 13:06:25

标签: c# timer foreach

在我正在工作的公司中,我们想要构建一个自动化工具,该工具应该运行用文本编写的脚本。我是计时器的新手,我想做的是制作一个foreach(不是必须的),它将在脚本中逐行运行并调用解析器供以后使用。 我想要的是这样的:

        aTimer = new System.Timers.Timer(10000);

        // Hook up the Elapsed event for the timer.


        // Set the Interval to 2 seconds (2000 milliseconds).
        aTimer.Interval = 2000;
        aTimer.Enabled = true;

        foreach (ScriptCell CELL in ScriptList)
        {
            //fire the method when time is up
            aTimer.Elapsed += new ElapsedEventHandler(DoScriptCommand(CELL.CellText));


        }

我知道我所写的内容并没有多少意义,但我在这里是一个无能为力的

PS。在发布此Q之前,我正在寻找其他主题,但我没有发现任何似乎填补空白的内容

4 个答案:

答案 0 :(得分:2)

await的引入使得序列中的每个项目都有效,同时在每个项目之间等待一段时间,非常简单:

foreach(var cell in ScriptList)
{
    DoScriptCommand(cell.CellText)
    await Task.Delay(TimeSpan.FromSeconds(2));
}

答案 1 :(得分:1)

在经过的事件中执行此操作,而不是每行的新处理程序(否则它们将以并行方式执行)

aTimer.Elapsed += new ElapsedEventHandler((sender, args) => 
{
    foreach (ScriptCell CELL in ScriptList)
    {
        DoScriptCommand(CELL.CellText);
    }
}

答案 2 :(得分:0)

如果您只是想定期运行脚本或脚本,我会搜索“cron”,如果您使用的是Unix / Linux机器或“Windows任务计划程序”,如果您使用的是Windows机器。这些工具中的每一个都允许您指定脚本的路径,它们应运行的间隔,要使用的命令行参数等。

答案 3 :(得分:-2)

我在申请中做了一点俄罗斯方块。 我用这个代码的计时器:我希望它会帮助你。 如果你不使用线程,你的程序将在计时器运行时卡住 所以我使用这样的线程:

private void ciz()
{
    int beklemeSuresi = 1000;//1000 = 1sec
    for (int i = 0; i < 15; i++)
    {
        if (g != null)
        {
            g.Clear(Color.AliceBlue);
        }
        solLCiz(100, 100 + i * 20, yon);
        Application.DoEvents();
        Thread.Sleep(beklemeSuresi);
    }
}

当然你必须在程序开头就开始这样的线程:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    ciz();
}

private void Form1_Load(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}