Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建一个高效的循环,以便在windows服务中每X分钟执行一次操作?_C#_Windows Services_Loops_Performance - Fatal编程技术网

C# 如何创建一个高效的循环,以便在windows服务中每X分钟执行一次操作?

C# 如何创建一个高效的循环,以便在windows服务中每X分钟执行一次操作?,c#,windows-services,loops,performance,C#,Windows Services,Loops,Performance,我正在编写一个windows服务,它应该每60秒执行一次操作 实现主循环的最佳方法是什么 到目前为止我看到的实现: 1)使用每xx秒执行一次委托的计时器对象 2)使用ManualResetEvents(我看到的实现只执行一次,但据我所知,可以使用此类resetevents创建循环) windows服务将一直运行,因此最好创建一个没有内存泄漏的服务 实现主循环的最佳方式是什么 评论后编辑: 每X秒执行一次的操作将启动多个(最多10个)线程。每个线程的运行时间不超过30秒请使用计时器。这将使该计划的

我正在编写一个windows服务,它应该每60秒执行一次操作

实现主循环的最佳方法是什么

到目前为止我看到的实现:
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(您的间隔))
我猜。