我运行一个Windows服务和使用循环和的Thread.Sleep重复任务,这将是最好使用一个计时器的方法?
如果是一个代码示例将是巨大的
我目前使用此代码重复
int curMinute;
int lastMinute = DateTime.Now.AddMinutes(-1).Minute;
while (condition)
{
curMinute = DateTime.Now.Minute;
if (lastMinute < curMinute) {
// do your once-per-minute code here
lastMinute = curMinute;
}
Thread.Sleep(50000); // sleeps for 50 seconds
if (error condition that would break you out of this) {
break; // leaves looping structure
}
}
class Program
{
static void Main(string[] args)
{
Timer timer = new Timer(new TimerCallback(TimeCallBack),null,1000,50000);
Console.Read();
timer.Dispose();
}
public static void TimeCallBack(object o)
{
curMinute = DateTime.Now.Minute;
if (lastMinute < curMinute) {
// do your once-per-minute code here
lastMinute = curMinute;
}
}
该代码可以像类似上面的一个
计时器是一个更好的主意,海事组织。 这样一来,如果您的服务要求停止,它可以给响应非常快,只是没有再打电话定时器节拍处理......如果你在睡觉,服务经理将不得不等待50秒杀死你线程,这两者都不是非常不错的。
要明白,你的代码会睡50秒结束一个循环,并开始下一之间是很重要的......
一个计时器会打电话每50秒的循环,这是不完全一样的。
他们俩都是有效的,但一个计时器也可能是你在找什么在这里。
要注意的是调用sleep()将冻结的服务,因此,如果该服务被要求停止时,它不会对睡眠()调用的时间作出反应。
是的,使用定时器将释放当前花费其大部分时间都在睡觉的主题。 一个定时器也会更准确地火每分钟所以你可能不会需要跟踪的lastMinute
了。
不太回答这个问题,但不具有
if (error condition that would break you out of this) {
break; // leaves looping structure
}
你或许应该有
while(!error condition)
另外,我有去Timer
。
我已经使用两个定时器和Thread.sleep代码(x)的,或任一,视情况而定。
如果我有简短的代码块,需要repeadedly跑,我可能会使用一个计时器。
如果我有一段代码,可能需要更长的时间比延时定时器运行(如通过FTP,在这里我不控制或知道网络延迟或文件大小/计数从远程服务器检索文件),我会等待对的周期之间一段固定的时间。
两者都是有效的,但正如前面指出的,他们做不同的事情。 定时器运行,每x毫秒你的代码,即使以前的实例尚未完成。 Thread.sleep代码(x)的等待完成每次迭代后的一段时间,所以每个环路的总延迟将总是更长(可能不是由多)比睡眠周期。
我需要一个线程每分钟闪光一次( 见这里的问题 ),现在我已经使用了DispatchTimer
根据我收到的答案。
这些问题的答案提供一些参考,你可能会发现有用。
我同意以及使用定时器是最好的选择。 我曾尝试类似过去你的解决方案,并开始有在那里,循环将失火的问题,我将不得不等待另一个Thread.sleep()方法之前,它会再次触发。 此外,它确实导致各种问题与停止的服务,我会得到它是如何不响应,并已被关闭不变错误。
@普拉香特的代码应该是正是你需要的。
您可以使用一个。 但我认为Sleep()
是容易的,明确的和更短的落实。
我不得不说,睡眠是与它后面的状态机更好地执行。 这仍然让你在任何时候应用程序的控制,但允许在任何特定的时间需要的任何回应。 这也将处理计时器回调是比“的循环处理的执行时间”短
例如..
<!-- language: c# -->
public enum State
{
Idle = 0,
Processing = 1,
Stop = 100,
}
public void Run()
{
State state = State.Idle; // could be a member variable, so a service could stop this too
double intervalInSeconds = 60;
System.DateTime nextExecution = System.DateTime.Now.AddSeconds(intervalInSeconds);
while (state != State.Stop)
{
switch (state)
{
case State.Idle:
{
if (nextExecution > System.DateTime.Now)
{
state = State.Processing;
}
}
break;
case State.Processing:
{
// do your once-per-minute code here
// if you want it to stop, just set it state to stop.
// if this was a service, you could stop execution by setting state to stop, also
// only time it would not stop is if it was waiting for the process to finish, which you can handle in other ways
state = State.Idle;
nextExecution = System.DateTime.Now.AddSeconds(intervalInSeconds);
}
break;
default:
break;
}
System.Threading.Thread.Sleep(1);
}
}