我怎样才能跑步#39;声明每x秒

时间:2017-04-30 11:39:09

标签: c# timer while-loop wait

我正在检查进程是否正在运行,如果没有启动该进程。 它工作正常,但只有一次,之后,语句结束,不再运行,这是预期的。

但我无法弄清楚如何每隔X秒运行一次。

这是我的代码:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        while (checkBox1.Checked)
        {

            var retVal = Process.GetProcesses().Any(p => p.ProcessName.Contains(textBox1.Text));

            if (retVal.Equals(true))
            {
                listBox1.Items.Add(textBox1.Text + @" " + @"is running." + @" " + DateTime.Now);
                return;
            }

             if (retVal.Equals(false))
             {
                    listBox1.Items.Add(textBox1.Text + @" " + @"is not running, attempting to start." + DateTime.Now);
                    Process.Start(textBox2.Text);
                    return;
             }
        }
    }

现在我知道每个if语句末尾的return语句会停止代码,但是如果我没有这样做会导致应用程序崩溃,因为它会不断地写入列表框。

如何运行代码

while (checkBox1.Checked)
每隔X秒?

2 个答案:

答案 0 :(得分:1)

您可以使用计时器进行检查。这很简单。

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (!checkBox1.Checked) return;
        var retVal = Process.GetProcesses().Any(p => p.ProcessName.Contains(textBox1.Text));
        if (retVal.Equals(true))
        {
            listBox1.Items.Add(textBox1.Text + @" " + @"is running." + @" " + DateTime.Now);
            return;
        }

        if (!retVal.Equals(false)) return;
        listBox1.Items.Add(textBox1.Text + @" " + @"is not running, attempting to start." + DateTime.Now);
        Process.Start(textBox2.Text);
    }

您可以从计时器属性中选择间隔。记住它是毫秒(1000毫秒= 1秒)。

enter image description here

答案 1 :(得分:1)

你可能使用WinForms,你的代码看起来非常像,但是因为它不在你的问题中,我会在OmerCDs中添加另一个解决方案。

您可以使用Task.Delay。但是,这会使线程休眠,因此不应该在主线程上运行。你可以使用这样的代码:

    Task.Run(async () => 
    {
        while (true)
        {
            while (checkBox1.Checked)
            {
                var retVal = Process.GetProcesses().Any(p => p.ProcessName.Contains(textBox1.Text));
                if (retVal.Equals(true))
                {
                    listBox1.Items.Add(textBox1.Text + @" " + @"is running." + @" " + DateTime.Now);
                    return;
                }
                if (retVal.Equals(false))
                {
                    listBox1.Items.Add(
                        textBox1.Text + @" " + @"is not running, attempting to start." + DateTime.Now);
                    Process.Start(textBox2.Text);
                    return;
                }
            }
            await Task.Delay(2 /*your waiting time in seconds*/ * 1000);
        }
    });