如何减少处理器消耗?

时间:2013-12-10 12:31:57

标签: c# time clock alarm processor

我制作了一个C#闹钟,它运行正常。问题是,当它运行时它消耗20%的处理器(在i5 2410M处理器上)我该怎么办? 这是我的代码:

using System;
namespace assigment1
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime uptime = new DateTime (2013,12,10,4,0,0);
            Console.WriteLine("This alarm is set to go off at 4:00 am");
            while (true)
            {

                if (DateTime.Now.Minute == uptime.Minute && DateTime.Now.Hour == uptime.Hour)
                {
                    for (int j = 1000; j < 22767; j++)
                     {


                        Console.Beep(j, 500);
                        Console.Write("Wake up! it is {0}:{1} already! ", DateTime.Now.Hour, DateTime.Now.Minute);
                     }

                }
             }
        }
    }
}

6 个答案:

答案 0 :(得分:2)

这是因为您的while循环连续运行而没有任何中断。添加Thread.Sleep。这将在检查之间添加暂停并大大提高您的绩效:

class Program
{
    static void Main(string[] args)
    {
        DateTime uptime = new DateTime (2013,12,10,4,0,0);
        Console.WriteLine("This alarm is set to go off at 4:00 am");
        while (true)
        {

            if (DateTime.Now.Minute == uptime.Minute && DateTime.Now.Hour == uptime.Hour)
            {
                for (int j = 1000; j < 22767; j++)
                 {


                    Console.Beep(j, 500);
                    Console.Write("Wake up! it is {0}:{1} already! ", DateTime.Now.Hour, DateTime.Now.Minute);
                 }                     

            }

            Thread.Sleep(1500); // Sleep 1.5 seconds.
         }
    }
}

答案 1 :(得分:1)

如果你想要一个闹钟,为什么你不使用Timer Class

答案 2 :(得分:1)

我不知道你是否可以这样做,但你可以通过Priority属性更改执行线程的线程优先级。您可能想尝试以下方法:

Thread.CurrentThread.Priority = ThreadPriority.Lowest;

另外,我认为你真的不想限制它。如果机器处于闲置状态,你会喜欢它忙于完成任务,对吗? ThreadPriority有助于将其传达给调度程序。

答案 3 :(得分:1)

您将检查放在while循环中,这意味着它将占用您处理器的大部分时间。

我建议看看这篇文章(http://www.infolet.org/2012/11/create-digital-clock-on-c-sharp-program-code.html),它描述了如何使用Timer Class来做到这一点。

更新: 这个答案非常好,如果您乐意使用活动,可能更适合; https://stackoverflow.com/a/1493235/465404

答案 4 :(得分:1)

您需要计算直到闹铃响起的时间并使用timer class。只需将间隔设置为警报之前的剩余时间,然后停止计时器。这样的事情应该有效

DateTime alarmTime = new DateTime(2013,12,10,4,0,0);
System.Windows.Forms.Timer alarmTimer = new System.Windows.Forms.Timer();
alarmTimer.Interval = (alarmTime - DateTime.Now).Milliseconds;
alarmTimer.Tick += alarmTimer_Tick;
alarmTimer.Start();

你的活动

void alarmTimer_Tick(object sender, EventArgs e)
{
    alarmTimer.Stop();
    Console.Write("Wake up! it is {0}:{1} already! ", DateTime.Now.Hour, DateTime.Now.Minute);
}

答案 5 :(得分:0)

我认为你肯定应该使用Timer类来报警,只需相应地改变勾选间隔。这也很容易让您管理警报的重复发生。

因此,你的间隔时间是设置闹钟和你想要闹钟之间的时间差。

我在Win Forms应用程序中使用了多个并发运行的资源,资源利用率非常低。