2012-06-19 93 views
3

我有一份工作清单。每项工作都有自己的运行时间。他们需要运行时间。我想两种不同的方式。使用长时间Thread.Sleep是个好主意吗?

public class Job 
{ 
    public int JobPeriod {get;set;} // for example as hour: daily = 24, weekly = 7 * 24, monthly = 30 * 24 
    public DateTime RunTime {get;set} 
} 

第一种方式:

我开始一个新的主线程。该线程以特定时间间隔(5秒,10秒等)检查作业。当作业的运行时间到了时,主线程将开始并完成作业。以这种方式持续运行的主线程。

while (true) 
{ 
    lock (Locker) 
    { 
     // checks job list. 
     var jobs = foo.GetIncomingTimeJobs(); 
     foreach (var job in jobs) 
     { 
      ParameterizedThreadStart ts = RunJob; 
      var th = new Thread(ts); 
      th.Start(job); 
     } 

     Thread.Sleep(10000); 
    } 
} 

public void RunJob(Job job) 
{ 
    // do somethings 
} 

方式二:

当应用程序启动时,我创建在作业列表每个作业一个新的线程。所有这些创建的线程都将启动。当Job的线程启动时,作业的线程会检查作业的运行时间。

例如:

var jobs = foo.GetAllJobs(); 
foreach (var job in jobs) 
{ 
     ParameterizedThreadStart ts = RunJob; 
     var th = new Thread(ts); 
     th.Start(job); 
} 

public void RunJob(Job job) 
{ 
    while (true) 
    { 
     lock (Locker) 
     { 
      // do somethings 
      var period = job.JobPeriod * 60 * 1000; 
      Thread.Sleep(period); 
     } 
    } 
} 

如果有10个职位,有将有十个线程。而这十个线程永远不会结束。会睡觉,会继续,会睡觉,会继续...

线程睡这么长时间是否正常?我应该使用哪种方式?还是有另一种做这种事情的方式?

+3

线程是昂贵的资源。你为什么不使用计时器? – Niki

+0

@nikie我想用线程。没有其他原因。 – sinanakyazici

+1

@sinanakyazici - 如果你拒绝接受我们的建议你为什么在这里?为什么你把你的主线睡觉,我没有看到这样做的好处。你的代码不是有效的,容易出现问题,我是从经验中发言的。至少你应该使用4.5和诸如Task等其他功能。 –

回答

4

这两种方法在大多数情况下都不正确。这种问题的常见解决方案是使用System.Threading.Timer。对于你的情况的示例代码可以看起来像:

private void CheckJobs(object state) 
{ 
    lock (Locker) 
    { 
     // checks job list. 
     var jobs = foo.GetIncomingTimeJobs(); 
     foreach (var job in jobs) 
     { 
      var thread = new Thread(foo); 
      thread.Start(); 
     } 
    } 
} 

private void StartProcessing() 
{ 
    var timer = new System.Threading.Timer(CheckJobs, null, 0, 10000); 
} 

当你调用StartProcessing()函数,定时器将被初始化和工作列表会每10秒检查。

如果使用Thread.Sleep(),您的应用程序将变得无响应。

相关问题