2012-06-19 5 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); 
     } 
    } 
} 

Если есть десять рабочих мест, будет десять нитей. И эти десять нитей никогда не кончатся. будет спать, будет продолжать, будет спать, будет продолжаться ...

Нормально ли для потоков спать так долго? Каким образом я должен использовать? Или есть другой способ сделать такое?

+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(), ваше приложение станет очень неактуальным.

Смежные вопросы