C# 如何创建一个高效的循环,以便在windows服务中每X分钟执行一次操作?
我正在编写一个windows服务,它应该每60秒执行一次操作 实现主循环的最佳方法是什么 到目前为止我看到的实现:C# 如何创建一个高效的循环,以便在windows服务中每X分钟执行一次操作?,c#,windows-services,loops,performance,C#,Windows Services,Loops,Performance,我正在编写一个windows服务,它应该每60秒执行一次操作 实现主循环的最佳方法是什么 到目前为止我看到的实现: 1)使用每xx秒执行一次委托的计时器对象 2)使用ManualResetEvents(我看到的实现只执行一次,但据我所知,可以使用此类resetevents创建循环) windows服务将一直运行,因此最好创建一个没有内存泄漏的服务 实现主循环的最佳方式是什么 评论后编辑: 每X秒执行一次的操作将启动多个(最多10个)线程。每个线程的运行时间不超过30秒请使用计时器。这将使该计划的
1)使用每xx秒执行一次委托的计时器对象
2)使用ManualResetEvents(我看到的实现只执行一次,但据我所知,可以使用此类resetevents创建循环) windows服务将一直运行,因此最好创建一个没有内存泄漏的服务 实现主循环的最佳方式是什么 评论后编辑:
每X秒执行一次的操作将启动多个(最多10个)线程。每个线程的运行时间不超过30秒请使用计时器。这将使该计划的意图最为明确。从OnStart和OnStop方法启动和停止计时器很容易,回调将在线程池中启动,这样就不会占用线程。计时器对象本身不会泄漏内存。(您仍然可以编写一个泄漏内存的bug,但这对于主循环的任何实现都同样容易做到。)使用计时器。这将使该计划的意图最为明确。从OnStart和OnStop方法启动和停止计时器很容易,回调将在线程池中启动,这样就不会占用线程。计时器对象本身不会泄漏内存。(您仍然可以编写一个泄漏内存的bug,但这对于主循环的任何实现来说都同样容易做到。)如果您的操作不会花费超过xx秒的时间,我会使用计时器。如果不是的话,我会参加这些活动。我假设您不希望同时运行多个操作。如果您的操作不会花费超过xx秒的时间,我将使用计时器。如果不是的话,我会参加这些活动。我假设您不希望同时运行多个操作。如果您使用system.timers.timer,请确保将autoreset设置为false,然后启动它并结束进程。这里有一个完整的例子
如果您确实使用system.timers.timer,请确保将autoreset设置为false,然后启动它并结束您的过程。这里有一个完整的例子
考虑使用。我正在使用这个图书馆,我对它很满意。您可以根据需要设置自定义cron计划。考虑使用。我正在使用这个图书馆,我对它很满意。您可以根据需要设置自定义cron计划。这里是另一个非常常见的模式,它使用
ManualResetEvent
作为停止和节流机制
public class Example
{
private Thread m_Thread;
private ManualResetEvent m_StopSignal = new ManualResetEvent(false);
public void Start()
{
m_Thread = new Thread(Run);
m_Thread.Start();
}
public void Stop()
{
m_StopSignal.Set();
if (!m_Thread.Join(MAX_WAIT_TIME))
{
m_Thread.Abort() // Abort as a last resort.
}
}
private void Run()
{
while (!m_StopSignal.WaitOne(YOUR_INTERVAL))
{
// Your task goes here.
}
}
}
下面是另一个非常常见的模式,它使用
ManualResetEvent
作为停止和节流机制
public class Example
{
private Thread m_Thread;
private ManualResetEvent m_StopSignal = new ManualResetEvent(false);
public void Start()
{
m_Thread = new Thread(Run);
m_Thread.Start();
}
public void Stop()
{
m_StopSignal.Set();
if (!m_Thread.Join(MAX_WAIT_TIME))
{
m_Thread.Abort() // Abort as a last resort.
}
}
private void Run()
{
while (!m_StopSignal.WaitOne(YOUR_INTERVAL))
{
// Your task goes here.
}
}
}
你想要多高的精度?如果一次迭代的时间比预期的要长,那么下一次迭代应该等待开始吗?您希望的精度是多少?如果一次迭代的时间比预期的长,那么下一次迭代是否应该等待开始?我编辑我的问题是为了回答您关于一次运行多个操作的问题。我编辑我的问题是为了回答您关于一次运行多个操作的问题。应该是
while(!m_StopSignal.WaitOne(您的间隔))
我猜。应该是而(!m_StopSignal.WaitOne(您的间隔))
我猜。