「ハートビート」プロセスを実装して、1 日を通して多くのクリーンアップ タスクを繰り返し実行することを検討しています。
これはコマンド パターンを使用する良い機会のように思えたので、次のようなインターフェイスを用意しました。
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);
}
}
最後に、このループでコンソール アプリケーションが実行され、ThreadPool に追加する待機中のタスクを探します。
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」なデザインのように見えますか? 何か変えることはありますか?