我该如何在特定的时间(比如16:00)启动一个后台线程?
当应用程序启动时,该线程将等待到指定时间。但如果应用程序在指定时间之后启动,则该线程将立即运行。
ThreadPool.QueueUserWorkItem(MethodtoRunAt1600);
我该如何在特定的时间(比如16:00)启动一个后台线程?
当应用程序启动时,该线程将等待到指定时间。但如果应用程序在指定时间之后启动,则该线程将立即运行。
ThreadPool.QueueUserWorkItem(MethodtoRunAt1600);
你可以在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
}
然后使用以下方式进行设置
SetUpTimer(new TimeSpan(16, 00, 00));
编辑:保留 Timer 的引用,因为无论 Timer 是否活动,它都会受到垃圾回收的影响。
Timer
构造函数的最后一个参数中传递Timeout.FromDays(1)
而不是Timeout.InfiniteTimeSpan
。还请注意,如果时间已经过去,则可能需要更改跳过触发计时器的if语句。 - Sriram SakthivelTimeout.FromDays(1)
是他需要的。 - Sriram Sakthivel我会使用类似于Quartz的作业调度库,或者简单地创建控制台应用程序,并在特定时间运行它,使用Windows任务计划程序。
System.Timers.Timer
或其他任何.NET计时器设置特定时间。你只能为一段时间设置它们。 - Jim Mischel您可以使用定时器来完成:
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;
}
}
System.Timers.Timer
,System.Threading.Timer
或其他计时器的解决方案,在夏令时改变面前都将失败。如果您使用这些定时器之一,您将不得不进行一些轮询。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()
}
// By the way, this code would be *INSIDE* of the background thread. That's what
// the sentence above says, but apparently we devs only read code :)
while (DateTime.Now.TimeOfDay < myDesiredStartTime)
{
Thread.Sleep(1000);
}
var runAt = DateTime.Today + TimeSpan.FromHours(16);
if(runAt < DateTime.Now)
{
MethodtoRunAt1600();
}
else
{
var dueTime = runAt - DateTime.Now;
var timer = new System.Threading.Timer(_ => MethodtoRunAt1600(), null, dueTime, TimeSpan.Zero);
}
我们可以这样使用吗?
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();
}
然后每隔一分钟检查一次...
void timer_Tick(object sender, EventArgs e)
{
if (DateTime.Now.Hour == 16)
{
// Start your task
}
}
1- 从另一个进程调用您的应用程序
System.Diagnostics.Process.Start("CMD MyApplication.exe", "/C TIME 16:00");
2- 使用Timer
,每1分钟检查当前时间。
3- 在您的应用程序中处理Windows时间更改事件,并每次检查当前时间,获取更多信息:
http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.timechanged%28v=vs.100%29.aspx
我希望其中一个可以帮到您。