Bob*_*Bob 33 .net c# multithreading
如何在一天中的特定时间(例如16:00)启动后台线程?
因此,当应用程序启动时,线程将一直等到那个时间.但如果应用程序在该时间之后启动,那么该线程将立即运行
ThreadPool.QueueUserWorkItem(MethodtoRunAt1600);
Sri*_*vel 57
你可以设置一个计时器16:00.我在这里回答了类似的问题.这应该对你有所帮助.
private System.Threading.Timer timer;
private void SetUpTimer(TimeSpan alertTime)
{
DateTime current = DateTime.Now;
TimeSpan timeToGo = alertTime - current.TimeOfDay;
if (timeToGo < TimeSpan.Zero)
{
return;//time already passed
}
this.timer = new System.Threading.Timer(x =>
{
this.SomeMethodRunsAt1600();
}, null, timeToGo, Timeout.InfiniteTimeSpan);
}
private void SomeMethodRunsAt1600()
{
//this runs at 16:00:00
}
Run Code Online (Sandbox Code Playgroud)
然后使用它进行设置
SetUpTimer(new TimeSpan(16, 00, 00));
Run Code Online (Sandbox Code Playgroud)
编辑:保留定时器的引用,因为无论Timer是否处于活动状态,它都会被垃圾回收.
Dam*_*ith 10
我会像Quartz一样使用Job Scheduling Library,或者只是创建控制台应用程序,并在一天中的特定时间使用Windows任务调度程序运行它.
你可以用计时器做到这一点:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
依赖于任何解决方案System.Timers.Timer,System.Threading.Timer或任何当前存在于.NET Framework中的其他定时器将在夏令时更改的脸失败.如果您使用任何这些计时器,您将不得不进行一些轮询.
Windows有一个可以使用的Waitable Timer,但任何Framework类都不支持它.几年前我为它写了一个包装器.我发布的文章已不再可用,但您可以从http://www.mischel.com/pubs/waitabletimer.zip下载完整的源代码.
也就是说,如果你的程序所做的唯一事情是每天运行一次,或者如果它执行的任务可以从程序的其余部分中分离出来,那么你几乎肯定会更好地完成计划任务.虽然我还没有使用Quartz.NET,但根据我从那些我信任的判断中看到的好评,我毫无疑问推荐它.
| 归档时间: |
|
| 查看次数: |
80995 次 |
| 最近记录: |