我怎么能总是让我的应用程序响应

时间:2013-12-20 14:49:24

标签: c# multithreading

我做了一个正在循环等待的程序,直到用户输入匹配系统时间的时间......但问题只要它在循环中等待,直到时间匹配它给出没有响应的符号,这不是那么“可爱“,用户会认为我的程序卡住..所以我希望我的程序看起来正常”没有滚动鼠标,没有响应标志,没有苍白的窗口“我希望它能正常运行..我怎么能这样做?我用c#

     private void button1_Click(object sender, EventArgs e)
        {
            string clock;
            clock = textBox1.Text;
            System.Windows.Forms.MessageBox.Show("system will close in " + clock);
            if (radioButton1.Checked)
            {
                clock = clock + " AM";
            }
            if (radioButton2.Checked)
            {
                clock = clock + " PM";
            }
            while (DateTime.Now.ToString("h:mm tt") != clock)
            {
                if (DateTime.Now.ToString("h:mm tt") == clock)
                    break;

            }

            System.Diagnostics.Process.Start("shutdown", "/s /t 0");
            this.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string clock;
            clock = textBox1.Text;
            System.Windows.Forms.MessageBox.Show("system will Restart in " + clock);
            if (radioButton1.Checked)
            {
                clock = clock + " AM";
            }
            if (radioButton2.Checked)
            {
                clock = clock + " PM";
            }
            while (DateTime.Now.ToString("h:mm tt") != clock)
            {
                if (DateTime.Now.ToString("h:mm tt") == clock)
                    break;

            }
            System.Diagnostics.Process.Start("shutdown", "/r /t 0");
            this.Close();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            string clock;
            clock = textBox1.Text;
            System.Windows.Forms.MessageBox.Show("system will lock in " + clock);
            if (radioButton1.Checked)
            {
                clock = clock + " AM";
            }
            if (radioButton2.Checked)
            {
                clock = clock + " PM";
            }
            **while (DateTime.Now.ToString("h:mm tt") != clock)
            {
                if (DateTime.Now.ToString("h:mm tt") == clock)
                    break;

            }**

            LockWorkStation();
            this.Close();

        }

        private void button3_Click(object sender, EventArgs e)
        {
            string clock;
            clock = textBox1.Text;
            System.Windows.Forms.MessageBox.Show("system will logg off in " + clock);
            if (radioButton1.Checked)
            {
                clock = clock + " AM";
            }
            if (radioButton2.Checked)
            {
                clock = clock + " PM";
            }
            while (DateTime.Now.ToString("h:mm tt") != clock)
            {
                if (DateTime.Now.ToString("h:mm tt") == clock)
                    break;

            }

            ExitWindowsEx(0, 0);
            this.Close(); 

        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }
    }
}

2 个答案:

答案 0 :(得分:1)

您的计划经常检查时间。这可能会导致您看到的行为。通常,您将检查时间,然后稍等一会儿再次检查,从而允许OS进程调度程序让其他程序线程(如处理窗口事件的程序)运行。

您可能还想检查以确保当前时间超过目标时间(而不是对相等进行严格比较)。

我不知道你是如何处理GUI事件或其他线程的,所以你可能需要以不同的方式进行睡眠/产生。

我认为这是Java(?)。这是一个等待“很好”的mod的例子。 (来自button1_Click

while (DateTime.Now.ToString("h:mm tt") >= clock)
{
    if (DateTime.Now.ToString("h:mm tt") >= clock)
        break;
    }
    Thread.sleep(1000);
}

答案 1 :(得分:1)

应该很容易。大多数编程语言/库(你使用?)都有一个“等待”功能,一个计时器或类似的东西。

您不希望使用循环周期等待一段时间。