这个方法同样存在CPU占用高的问题。但是我意外地发现了另一个现象,在调试模式下,注意:是调试模式,增加了 Console.WriteLine("")调用,结果CPU占用下降到了1%以下! int n = 0; while (isRunning == true) { n = Environment.TickCount; while (Environment.TickCount - n < 3000) { Console.WriteLine(""); Application.DoEvents(); } } 不过,如果是直接运行(不调试),那么CPU占用又接近50%了。我想这应该因为是Console.WriteLine("");占用了时间,所以循环的次数大大减少了。但是程序在运行时我找不到让程序代替Console.WriteLine("")而做无用功的方法。。不然可以作为暂时解决方法。以下是测试代码: int n = 0; int counter = 0; while (isRunning == true) { //Application.DoEvents(); n = Environment.TickCount; while (Environment.TickCount - n < 3000) { counter++; Console.WriteLine(counter); Console.WriteLine(Environment.TickCount); Application.DoEvents(); } }结果显示,在while (Environment.TickCount - n < 3000)循环中,只进行了约128次循环。而在下面的代码中,进行了约300万次循环。 int n = Environment.TickCount; int counter = 0; while (Environment.TickCount - n < 3000) { counter++; Application.DoEvents(); }
其实Environment.TickCount并没有发挥作用,因为以下两段代码的CPU占用率是相差无几的。 int counter = 0; while (isRunning == true) { counter++; Console.WriteLine(counter); Application.DoEvents(); } int n = 0; int counter = 0; while (isRunning == true) { n = Environment.TickCount; while (Environment.TickCount - n < 3000) { counter++; Console.WriteLine(counter); Application.DoEvents(); } }
用这个TimerTimer 类
IsXXX()==false 进行了一次比较,而!IsXXX()应该是一次运算,不知道哪个性能更好呢。
=====================================================================================
效果相当于一个监听功能:当满足条件时IsXXX()返回true,否则返回false。前提:总会到达满足条件的时候,但是时间不确定。如果没有满足条件,则一直等待下去,不执行另外的语句,但是界面要能够响应操作,否则这个监听就无法控制了。
代码如下: private bool m_isLisening = true; private void button1_Click(object sender, EventArgs e)
{
if (IsDoNext() == true)
{
//执行语句块A
}
else
{
//执行语句块B
}
} private void button2_Click(object sender, EventArgs e)
{
//切换监听状态
if (m_isLisening == true)
{
m_isLisening = false;
}
else
{
m_isLisening = true;
}
} private bool IsDoNext()
{
while (IsOK() == false && m_isLisening == true)
{
Thread.Sleep(3000);
}
} private bool IsOK()
{
if (满足条件)
{
return true;
}
else
{
return false;
}
}=====================================================================================
while(IsXXX()==false)
{
Application.DoEvents();
}
.....//然后继续干你的事。
//Thread.Sleep(3000);
替换为
int n = Environment.Tick;
while(Environment.Tick-n<3000) Application.DoEvents();
求良方
int n = 0;
while (isRunning == true)
{
n = Environment.TickCount;
while (Environment.TickCount - n < 3000)
{
Console.WriteLine("");
Application.DoEvents();
}
}
不过,如果是直接运行(不调试),那么CPU占用又接近50%了。我想这应该因为是Console.WriteLine("");占用了时间,所以循环的次数大大减少了。但是程序在运行时我找不到让程序代替Console.WriteLine("")而做无用功的方法。。不然可以作为暂时解决方法。以下是测试代码: int n = 0;
int counter = 0;
while (isRunning == true)
{
//Application.DoEvents();
n = Environment.TickCount;
while (Environment.TickCount - n < 3000)
{
counter++;
Console.WriteLine(counter);
Console.WriteLine(Environment.TickCount);
Application.DoEvents();
}
}结果显示,在while (Environment.TickCount - n < 3000)循环中,只进行了约128次循环。而在下面的代码中,进行了约300万次循环。 int n = Environment.TickCount;
int counter = 0;
while (Environment.TickCount - n < 3000)
{
counter++;
Application.DoEvents();
}
while (isRunning == true)
{
counter++;
Console.WriteLine(counter);
Application.DoEvents();
}
int n = 0;
int counter = 0;
while (isRunning == true)
{
n = Environment.TickCount;
while (Environment.TickCount - n < 3000)
{
counter++;
Console.WriteLine(counter);
Application.DoEvents();
}
}
ssss
System.Threading.Thread.Sleep(100);
防假死