gpt4 book ai didi

c# - 您将如何更改我用 C# 编写的 Heartbeat 进程?

转载 作者:太空狗 更新时间:2023-10-29 18:08:58 25 4
gpt4 key购买 nike

我正在考虑实现一个“心跳”流程来全天执行大量重复的清理任务。

这似乎是使用命令模式的好机会,所以我有一个如下所示的界面:

   public interface ICommand
{
void Execute();
bool IsReady();
}

然后我创建了几个我想要运行的任务。这是一个基本示例:

public class ProcessFilesCommand : ICommand
{
private int secondsDelay;
private DateTime? lastRunTime;

public ProcessFilesCommand(int secondsDelay)
{
this.secondsDelay = secondsDelay;
}

public void Execute()
{
Console.WriteLine("Processing Pending Files...");
Thread.Sleep(5000); // Simulate long running task
lastRunTime = DateTime.Now;
}

public bool IsReady()
{
if (lastRunTime == null) return true;

TimeSpan timeSinceLastRun = DateTime.Now.Subtract(lastRunTime.Value);
return (timeSinceLastRun.TotalSeconds > secondsDelay);
}

}

最后,我的控制台应用程序在此循环中运行,寻找要添加到线程池的等待任务:

class Program
{
static void Main(string[] args)
{

bool running = true;

Queue<ICommand> taskList = new Queue<ICommand>();
taskList.Enqueue(new ProcessFilesCommand(60)); // 1 minute interval
taskList.Enqueue(new DeleteOrphanedFilesCommand(300)); // 5 minute interval

while (running)
{
ICommand currentTask = taskList.Dequeue();
if (currentTask.IsReady())
{
ThreadPool.QueueUserWorkItem(t => currentTask.Execute());
}
taskList.Enqueue(currentTask);
Thread.Sleep(100);
}

}
}

除了我在操作系统课上做过的一些工作外,我在多线程方面没有太多经验。但是,据我所知,我的线程都没有访问任何共享状态,因此它们应该没问题。

对于我想做的事情来说,这看起来像是一个“OK”的设计吗?您有什么要改变的吗?

最佳答案

这是一个很好的开始。我们最近做了很多这样的事情,所以我可以提供一些建议。

  1. 不要将线程池用于长时间运行的任务。线程池旨在运行许多微小的小任务。如果您正在执行长时间运行的任务,请使用单独的线程。如果您使线程池处于饥饿状态(用完所有任务),排队的所有内容只会等待线程池线程可用,从而显着影响线程池的有效性能。

  2. 让 Main() 例程跟踪运行的时间以及每次运行的时间。不是每个命令都说“是的,我准备好了”或“不,我还没准备好”,这对每个命令都是一样的,只需有 LastRun 和 Interval 字段,然后 Main() 可以使用它们来确定每个命令何时需要运行.

  3. 不要使用队列。虽然它看起来像是一个队列类型的操作,但由于每个命令都有自己的间隔,所以它实际上不是一个普通的队列。而是将所有命令放在一个列表中,然后按下一次运行的最短时间对列表进行排序。使线程休眠,直到需要运行第一个命令。运行该命令。通过下一个要运行的命令对列表进行排序。 sleep 。重复。

  4. 不要使用多线程。如果每个命令的间隔是一分钟或几分钟,您可能根本不需要使用线程。您可以通过在同一个线程上执行所有操作来简化。

  5. 错误处理。这种事情需要大量的错误处理,以确保一个命令中的问题不会导致整个循环失败,这样您就可以在问题发生时对其进行调试。您可能还想决定是否应在错误时立即重试命令,或者等到下一次计划运行,甚至比正常情况下延迟更多。如果错误每次都发生,您可能还希望不在命令中记录错误(经常运行的命令中的错误很容易创建巨大的日志文件)。

关于c# - 您将如何更改我用 C# 编写的 Heartbeat 进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2144197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com