0

質問に適切な名前を付ける方法がわかりません。自由に編集してください。

サーバーでバックグラウンド コンソール アプリケーションを実行しています。コンソール アプリケーションは、電子メールを送信し、時々 (5 分ごとに) ちょっとしたことを行います。

タスクマネージャーを介して5分ごとに開始されないアプリケーション。インストールプロセスで1回開かれ、無限ループとthread.sleepが実行を続けます。そのため、特定のパラメーターを使用してアプリケーションを開くようにタスク マネージャーを構成することはできません。

ここで、12 時間ごとに実行するタスクを追加する必要があり、同じアプリケーションを使用したいと考えています。タスクはいくつかのファイルの削除と作成で構成されますが、5 分ごとにファイルの日付に基づいて最後の作成から 12 時間経過しているかどうかを確認するのは、私には少し賢明ではありません。

私が持っているのと同じアプリケーションを使用して 12 時間のループを刻む安価な方法 (データベースなし、ログなし、ファイル作成日なし、マルチスレッドなし) はありますか? そうでない場合、それを行う最善の方法は何ですか?

4

3 に答える 3

3

これが、Windows タスク スケジューラの目的です。すでに存在するものを再発明しても意味がありません。

http://windows.microsoft.com/en-us/windows7/Schedule-a-task

于 2012-06-27T22:31:43.447 に答える
1

ループせずに真夜中の utc にスケジューリングする効率的な方法を次に示します。

var now=DateTime.UtcNow;
var today=now.Date;
var tomorrow=today.AddDays(1);
var dueTime=tomorrow-now;

System.Threading.Timer timer = null;
timer = new Timer(_ => {
    try
    {
        //do your thing
    }
    finally
    {
        timer.Dispose();
    }
},null,dueTime,TimeSpan.FromMilliseconds(-1d))
于 2012-06-27T23:25:26.613 に答える
1

私が理解しているように、5 分間待機してからタスク A を実行するループが既に存在します。ここで、12 時間ごとに実行されるタスク B を追加したいと考えています。両方を Timer オブジェクトに置き換えるか、タスク A の実行時に 5 分ごとに、タスク B が実行されてからの時間を確認します。少なくとも 12 時間の場合は、タスク B を実行します。

if (last12HourRun.Subtract(DateTime.Now).TotalHours > 12)
  // run task B
  last12HourRun = DateTime.Now;
于 2012-06-27T23:32:12.173 に答える