5 時間ごとに自動化されたジョブを実行する必要があります。
IScheduledTaskHandler と IScheduledTaskManager を使用して、スケジュールされたタスクを作成する方法に関するこの投稿を見つけました。 Orchard CMS を使用してスケジュールされたタスク
同じコードをコピーし、Process 関数内にサービス コールを追加しました。それはうまくコンパイルされます。しかし、Windows サービスの開始のように、このスケジュールされたタスクを「開始」する必要があるかどうかはわかりません。ソリューションをビルドした後、自動的に取得されますか? このジョブを 5 時間で実行したい場合、時計はいつ動き始めますか? また、停止/一時停止したい場合は、どうすればよいですか?
ありがとう。
編集:
タスク ハンドラーでカスタム モジュールを有効にしようとすると、例外が発生します。
例外の詳細: System.ArgumentNullException: 値を null にすることはできません。パラメータ名: ソース
Line 241: var shellContext = _shellContexts.FirstOrDefault(c => c.Settings.Name == settings.Name);
ソース ファイル: \orchard-1.4\src\Orchard\Environment\DefaultOrchardHost.cs 行: 241
_shellContexts が null として表示されます。プロジェクト/モジュールからタスク ハンドラー クラスを削除すると、すべて正常に動作します。
タスク ハンドラのコードは次のとおりです。
public class ScheduledTaskHandler : IScheduledTaskHandler
{
private const string TaskType = "MyTaskUniqueID";
private readonly IScheduledTaskManager _taskManager;
private readonly IMyService _myService;
public ILogger Logger { get; set; }
public ScheduledTaskHandler(IScheduledTaskManager taskManager, IMyService myService)
{
_myService = myService;
_taskManager = taskManager;
Logger = NullLogger.Instance;
try
{
DateTime firstDate = new DateTime().AddMinutes(5);
ScheduleNextTask(firstDate);
}
catch (Exception e)
{
this.Logger.Error(e, e.Message);
}
}
public void Process(ScheduledTaskContext context)
{
if (context.Task.TaskType == TaskType)
{
try
{
_myService.RunJob();
}
catch (Exception e)
{
this.Logger.Error(e, e.Message);
}
finally
{
DateTime nextTaskDate = new DateTime().AddHours(5);
ScheduleNextTask(nextTaskDate);
}
}
}
private void ScheduleNextTask(DateTime date)
{
if (date > DateTime.UtcNow)
{
var tasks = this._taskManager.GetTasks(TaskType);
if (tasks == null || tasks.Count() == 0)
this._taskManager.CreateTask(TaskType, date, null);
}
}
}