我制作了一个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);
}
}
}
}
}
}
答案 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应用程序中使用了多个并发运行的资源,资源利用率非常低。