线程超时或Thread.Sleep()长时间关闭还是中止线程?

时间:2011-02-27 16:56:48

标签: .net multithreading

我有一个基于配置启动某些任务的Windows服务。

每个任务都以自己的线程开始,一些任务每天一次。

我正在使用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();
    }

Run和Initialize方法是调用任务的抽象方法

2 个答案:

答案 0 :(得分:1)

而不是让一个线程长时间睡眠。制作一个短时间(1分钟)睡眠的短线程,每次检查自上次执行以来是否已经过了足够的时间。这更加强大,可以让您跟踪系统是否“仍然活着”

答案 1 :(得分:0)

我不确定OS是否会让你长时间睡眠。要么你需要改变你的设计。一个睡眠线程至少消耗~1 MB的RAM(对于它的上下文)。

尝试使用System.Threading.Timer或根据您的要求实施自己的日程安排课程。