У меня есть список заданий. Каждая работа имеет собственное время работы. Им нужно бежать, когда приходит время. Я думаю два разных способа.Это хорошая идея использовать давний 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);
}
}
}
Если есть десять рабочих мест, будет десять нитей. И эти десять нитей никогда не кончатся. будет спать, будет продолжать, будет спать, будет продолжаться ...
Нормально ли для потоков спать так долго? Каким образом я должен использовать? Или есть другой способ сделать такое?
Речь идет о дорогостоящих ресурсах. Почему бы вам не использовать таймер? – Niki
@nikie Я хочу использовать нить. Никакой другой причины. – sinanakyazici
@sinanakyazici - Если вы отказываетесь от нашего совета, зачем вы здесь? Почему вы помещаете свой основной поток в сон, я не вижу никакой пользы от этого. Ваш код не эффективен и подвержен проблемам, и я говорю по опыту. По крайней мере, вы должны использовать 4.5 функции, такие как Task и другие. –