私のプログラムには、長時間実行されるメソッドがあります。ですから、夜間や、ユーザーがアプリを操作していないときに実行したいと考えています。
ユーザーはテキスト ボックスに日時を入力し、その値をデータベースに保存します。
ユーザーが入力するとしましょう27th December 2012, midnight.
Example()
その正確な時間にメソッドの実行を開始したい。
これをプログラムする方法はありますか?
私のプログラムには、長時間実行されるメソッドがあります。ですから、夜間や、ユーザーがアプリを操作していないときに実行したいと考えています。
ユーザーはテキスト ボックスに日時を入力し、その値をデータベースに保存します。
ユーザーが入力するとしましょう27th December 2012, midnight.
Example()
その正確な時間にメソッドの実行を開始したい。
これをプログラムする方法はありますか?
さまざまなオプションがありますが、何を見つけましたか?
たとえば、Windowsタスクスケジューラを使用してタスクを実行したり、特定のタスクを開始する時間が近づいたかどうかを定期的にチェックするサービスを実行したりできます。
おそらく、 Quartzなどのジョブ スケジューリング用の既存のライブラリを調べる必要があります。特に、再帰的なジョブを計画している場合。
Quartz は、既存のアプリケーションに組み込むことも、スタンドアロン アプリとして個別に実行することもできます。
System.Timers.Timerオブジェクトを作成します。ユーザーが入力した時間をミリ秒単位で現在の時間を差し引いて計算します。その時間を、メソッドをElapsedイベントハンドラーとして使用してタイマーのコンストラクターに渡します。
Try this:
if (DateTime.Now == your time)
{
// do your process
}
You have a few options here - you can either have a service that polls the database for work to execute, and when it's time it executes the Example method. You could programatically place create a windows schedule task and that way you don't need to poll.
There is no method in MVC however to get a timed call back that far in advance.
You can use Threading.Timer to start your method after some delay:
DateTime date = // when you need method to run
TimeSpan dueTime = date - DateTime.Now;
Timer timer = new Timer(_ => Example(), null, dueTime, new TimeSpan(0));
You can specify period TimeSpan(24, 0, 0)
to execute method daily.
@Ulisesが述べたように、ジョブスケジューラを使用できます。または、そのタスクのロジックを分離できる場合は、Windowsスケジューラを使用できます。しかし、プログラム内でそれを行う必要がある場合は、コーディングの問題です。最初のスーパーバイザーメソッド:
static void Supervisor()
{
while (true)
{
DateTime time = ReadTimeFromFile();
if (Math.Abs((DateTime.Now - time).TotalMinutes) <= 1)
{
DeleteTimeFile(); // to indicate task is done
RunTask();
break;
}
Thread.Sleep(TimeSpan.FromSeconds(5));
}
}
次に、目標時間をファイルに書き込みます。そして、プログラムの開始時 (または他の適切な場所):
new Task(Supervisor, TaskCreationOptions.LongRunning).Start();
TaskCreationOptions.LongRunning オプションを使用して、ThreadPool の外部で別のスレッドを初期化することが非常に重要です。