2011-02-27 40 views
1

我有一个基于配置启动一些任务的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让你这么长时间休眠任务

+0

如果你分享一些代码显示你的线程启动和线程工的基本实现,包括你的异常处理你的问题可能会得到答案。现在唯一要做的事情就是猜测...... – rene 2011-02-27 17:13:14

+1

我不认为这么长时间的“睡眠”对节电休眠等有很好的处理,我不会“睡眠”超过一分钟。 – CodesInChaos 2011-02-27 20:46:50

回答

1

而不是有一个长时间睡觉的线程。做一个短暂的线程,休息很短的时间(1分钟),每次检查自上次执行以来是否有足够的时间。这是更强大,让你跟踪,如果你的系统是'仍然活着'

+0

thx这么多,我已经将超时改为1分钟,并检查它工作正常。 duuno是什么问题,但它现在正在工作 – 2011-05-27 08:42:18

0

抽象方法。要么你可能需要改变你的设计。睡眠线程至少会消耗〜1 MB的RAM(因为它是上下文)。

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

相关问题