Потоки и Thread.sleep()

305
16 ноября 2017, 02:02

Пытаюсь написать планировщик. Необходимо чтобы два потока (функции LoopGetTask и LoopExecTask) выполнялись параллельно, но Thread.Sleep не дает желаемого результата (выполняется только одна из функций). Создается впечатление, что Thread.Sleep влияет на оба потока независимо от того, где вызывается

public class Scheduler
{
    private Thread ThrExecTask;
    private Thread ThrGetTask;
    private Queue<int> taskList = new Queue<int>();
    public Scheduler()
        {
            work = false;
            ThrExecTask = new Thread(LoopExecTask);
            ThrGetTask = new Thread(LoopGetTask);
            ThrExecTask.Start();
            ThrGetTask.Start();
        }
    }
    private void LoopGetTask()
        {
            while(true)
            {
                //получить список задач... insert into taskList
                Thread.Sleep(20000);
            }
        }

    private void LoopExecTask()
    {
        while(true)
        { 
            //выполнить задачу exec taskList.first
            Thread.Sleep(1000);
        }
    }
}
Answer 1

То, выполняются ли потоки параллельно или нет, зависит от операционной системы и от количества логических процессоров в системе. Обычно, даже если у вас всего один логический процессор, система забирает время от времени управление у одного потока, и отдаёт другому, таким образом, потоки бегут практически параллельно.

Этим вы не можете управлять (и не должны).

Thread.Sleep исключает поток на время из этой схемы: данный поток просто не выбирается к выполнению системой разделения времени. На другие потоки это прямо не влияет. Разве что косвенно, если другие потоки дожидаются этого потока.

Иллюзия того, что потоки ведут себя «не так», может быть от того, что вы используете разделяемые данные (taskList) из разных потоков без синхронизации. Так делать запрещено.

По поводу корректной имплементации очереди заданий, загляните сюда: Имплементация Producer/Consumer pattern.

READ ALSO
Нужна помощь с потоками C#

Нужна помощь с потоками C#

Передо мной появилась такая задача: Создается n потоков, в каждый поток передается значение string, и в каждом потоке оно сравнивается в условии...

261
Заливка окружности цветом

Заливка окружности цветом

Как залить окружность тем цветом, который нужен именно мне? Есть форма, в которой пользователь выбирает цвет, и нужно этим цветом закрасить...

310
Как сохранить телеграмм бот в Visual Studio [требует правки]

Как сохранить телеграмм бот в Visual Studio [требует правки]

Всем доброго времени суток! Написал первый простенький телеграм бот на С#, суть в том что он проверяет записи в Гугл таблице и если на завтра...

332
Composition и Aggregation c#

Composition и Aggregation c#

У меня есть задача построить приложение кафеЕсть классы: Dish,Menu,Order

250