线程超时或Thread.Sleep()是否长时间关闭或中止线程?
问题描述:
我有一个基于配置启动一些任务的Windows服务。线程超时或Thread.Sleep()是否长时间关闭或中止线程?
每个任务从其自己的线程开始,一些任务每天符号一次。
我使用Thread.Sleep()
并计算下次运行的时间。
问题是,有时2或3天后服务仍在运行,但有些任务不运行。
睡眠时间是正确的,一切工作正常,我没有得到任何例外。
有什么可以使线程停止或睡眠方法中止线程?
这是线程
private void TaskLifeCycle()
{
try
{
// Create task object.
Type taskType = Type.GetType(this.ConfigurationElement.Task);
DebtLogic.Service.BackgroundTask bgTask = Activator.CreateInstance(taskType) as BackgroundTask;
bgTask.Context = this;
FireEvent(CreatedEventKey, new BackgroundTaskEventArgs(bgTask));
FireEvent(InitilizingEventKey, new BackgroundTaskEventArgs(bgTask));
bgTask.Initilize();
FireEvent(InitilizedEventKey, new BackgroundTaskEventArgs(bgTask));
// while the thread is alive, and did not abort then run.
while (this.CurrentThread.IsAlive)
{
try
{
//can run then block
if (CanRun(bgTask))
{
Run(bgTask);
}
}
catch (ThreadAbortException)
{
return;
}
catch (Exception ex)
{
FireEvent(ErrorEventKey,new BackgroundTaskErrorArgs(ex));
}
}
bgTask.Dispose();
}
catch (ThreadAbortException)
{
return;
}
catch (Exception ex)
{
FireEvent(ErrorEventKey, new BackgroundTaskErrorArgs(ex));
}
}
private bool CanRun(BackgroundTask bgTask)
{
if (this.ConfigurationElement.EventBasedTask)
{
return bgTask.CanRun();
}
TimeSpan time;
if (this.ConfigurationElement.Time != TimeSpan.Zero)
{
time = this.ConfigurationElement.Time - DateTime.Now.TimeOfDay;
if (time.TotalMilliseconds < 0)
time = time.Add(new TimeSpan(24, 0, 0));
}
else
{
time = new TimeSpan(0, 0, this.ConfigurationElement.Interval);
}
Thread.Sleep(time);
return bgTask.CanRun();
}
运行的主要功能和初始化的方法是调用我不知道,如果OS
让你这么长时间休眠任务
答
而不是有一个长时间睡觉的线程。做一个短暂的线程,休息很短的时间(1分钟),每次检查自上次执行以来是否有足够的时间。这是更强大,让你跟踪,如果你的系统是'仍然活着'
+0
thx这么多,我已经将超时改为1分钟,并检查它工作正常。 duuno是什么问题,但它现在正在工作 – 2011-05-27 08:42:18
答
抽象方法。要么你可能需要改变你的设计。睡眠线程至少会消耗〜1 MB的RAM(因为它是上下文)。
尝试使用System.Threading.Timer
或者根据您的要求实施您自己的日程安排类。
如果你分享一些代码显示你的线程启动和线程工的基本实现,包括你的异常处理你的问题可能会得到答案。现在唯一要做的事情就是猜测...... – rene 2011-02-27 17:13:14
我不认为这么长时间的“睡眠”对节电休眠等有很好的处理,我不会“睡眠”超过一分钟。 – CodesInChaos 2011-02-27 20:46:50