【问题标题】:How can i run 'while' statement every x seconds我如何每 x 秒运行一次“while”语句
【发布时间】:2017-09-28 02:13:54
【问题描述】:

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

但我不知道如何每 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 秒?

【问题讨论】:

  • 使用Thread.Sleep 或更好地使用System.Timers

标签: c# timer while-loop wait


【解决方案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);
    }

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

【讨论】:

    【解决方案2】:

    您可能使用 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);
            }
        });
    

    【讨论】:

    • 为什么不直接使用 Task.Delay 而不是嵌入的 Thread.Sleep?
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 2018-12-19
    • 2016-07-24
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多