继续运行方法的最佳方法是什么
本文关键字:方法 是什么 最佳 继续 运行 | 更新日期: 2023-09-27 18:34:39
我必须继续运行 24x7 的方法。基本上应用程序应使用某个线程每秒处理 40 个数据。我可以使用 while 或递归调用 ling 相同的方法。但在这两个过程中CPU使用率过高几乎高达95-100%。我不能使用计时器,因为则处理线程无法正常工作。根据提供的解决方案许多人谈论将 while 与线程睡眠一起使用。但是如果我使用线程睡眠然后它在每次迭代中都会延迟。我正在使用 C# 4.0。
我的问题:有没有更好的解决方案来减少CPU的使用?
主要方法:
static void Main(string[] args)
{
while(true)
{
processData();
Thread.sleep(1000);
// here i use a 1 second sleep just for give a breath of CPU.
//But this one second sleep make me delay for enter data processing.
// I am looking for a better solution that no sleep time will use and CPU usages will getting low.
}
}
//Method should run always
static string processData()
{
{
// Open and close threads to process the data in every second.
}
// processData(); // it can be used for recursive method calling
}
但是如果我使用线程睡眠,那么它在每次迭代中都会延迟。 我正在使用 C# 4.0。
您可以使用 Thread.Sleep(0)
,它指示:
应挂起此线程以允许其他等待线程执行。
static void Main(string[] args)
{
while(true)
{
processData();
Thread.sleep(0);
}
}
这将允许线程放弃一些处理给其他线程,防止它使用 100% 的 CPU,但仍允许它以几乎全速运行。
请注意,使用任何延迟虽然会降低整体 CPU 使用率,但会减慢总吞吐量。 最大化吞吐量的唯一方法是允许它不停地旋转,这当然会使 CPU 使用率非常高。
使用 System.Threading.Timer 你可以告诉它下次执行的时间,例如:
System.Threading.Timer myTimer = new System.Threading.Timer(~~~)
在 myTimer 回调中:
myTimer.Change(nextRunTime, newInterval);
这将在 nextRuntime 中运行接下来的代码,并且间隔将变为 newInterval。
有关"更改"方法的更多信息,请参阅此处:
http://msdn.microsoft.com/en-us/library/7hs7492w.aspx
在System.Threading.Timer上:
http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx
享受:)
抱歉,如果我冒昧了,我的印象是你不会使用计时器的原因是因为总是有一个固定的延迟,但使用这种方法,你可以在每次运行时调整延迟。
无论如何,如果您遇到计时器无法正确处理的问题,您能分享一下那里到底出了什么问题吗?也许能够提供帮助,并最终使用计时器或类似工具。
static void Main(string[] args)
{
while(true)
{
var beginTime = DateTime.Now;
processData();
var duration = DateTime.Now.Subtract( beginTime );
// if you want to run 40 times per second,
// you need to spend 1000/40 = 25ms per iteration
var sleepDuration = (int)(25 - duration.TotalMilliseconds);
if( 0 < sleepDuration )
{
Thread.sleep(sleepDuration);
}
}
}
编辑:正如另一个答案中所建议的,如果您的processData()
方法是线程安全的,则可以使用 Timer
类
下面的代码可能是一个合适的解决方案。有关更多详细信息,请查看此链接。
uint loops = 0;
while (true)
{
if (Environment.ProcessorCount == 1 || (++loops % 100) == 0)
{
processData();
Thread.Sleep(1);
}
else
{
processData();
Thread.SpinWait(20);
}
}