38

16:00 などの特定の時刻にバックグラウンド スレッドを開始するにはどうすればよいですか?

したがって、アプリが起動すると、スレッドはその時まで待機します。ただし、アプリがその時間以降に起動すると、スレッドはすぐに実行されます

ThreadPool.QueueUserWorkItem(MethodtoRunAt1600);

4

10 に答える 10

8

あなたはタイマーでそれを行うことができます:

public class OncePerDayTimer : IDisposable
{
    private DateTime _lastRunDate;
    private TimeSpan _time;
    private Timer _timer;
    private Action _callback;

    public OncePerDayTimer(TimeSpan time, Action callback)
    {
        _time = time;
        _timer = new Timer(CheckTime, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
        _callback = callback;
    }

    private void CheckTime(object state)
    {
        if (_lastRunDate == DateTime.Today)
            return;

        if (DateTime.Now.TimeOfDay < _time)
            return;

        _lastRunDate = DateTime.Today;
        _callback();
    }

    public void Dispose()
    {
        if (_timer == null)
            return;

        _timer.Dispose();
        _timer = null;
    }
}
于 2013-09-04T10:43:24.313 に答える
6

System.Timers.Timer、 、または .NET Framework に現在存在するその他のタイマーに依存するソリューションはSystem.Threading.Timer、夏時間の変更に直面すると失敗します。これらのタイマーのいずれかを使用する場合は、ポーリングを行う必要があります。

Windows には、使用できるWaitable Timerがありますが、どの Framework クラスでもサポートされていません。数年前にラッパーを書きました。私が公開した記事はもう入手できませんが、http://www.mischel.com/pubs/waitabletimer.zipから完全なソース コードをダウンロードできます。

とはいえ、プログラムが 1 日に 1 回実行するだけの場合、または実行するタスクをプログラムの残りの部分から分割できる場合は、ほぼ確実に、スケジュールされたタスクの方が適しています。また、Quartz.NET を使用したことはありませんが、信頼できる判断を下す人々から見た良いレビューに基づいて、問題なく推奨できます。

于 2013-09-04T13:16:23.087 に答える
2

非常に簡単な解決策:

if (DateTime.Now.Hour > 16)
{
    MethodtoRunAt1600();
}
else
{
    var next16 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 16, 0, 0);
    var timer = new Timer(MethodtoRunAt1600, null, next16 - DateTime.Now, TimeSpan.FromHours(24));
    timer.Start()
}
于 2013-09-04T10:35:45.980 に答える
0

このように使用できますか?

DispatcherTimer timer ;
// When application is started
if (DateTime.Now.Hour == 16)
{
   // Start your task
}
else
{
    timer = new DispatcherTimer();
    timer.Interval = new TimeSpan(0, 1, 0);
    timer.Tick += timer_Tick;
    timer.Start();
}

その後、1分ごとにチェックしてください..

void timer_Tick(object sender, EventArgs e)
{
    if (DateTime.Now.Hour == 16)
    {
        // Start your task
    }
}
于 2013-09-04T10:34:36.757 に答える
0

これは、この種の機能を実現するために使用したものです。 http://www.codeproject.com/Articles/12117/Simulate-a-Windows-Service-using-ASP-NET-to-run-sc

于 2013-09-04T11:37:55.293 に答える