Member 12813182 Ответов: 2

Как получить код для многопоточности с одинаковым приоритетом в раунд-Роббин или отрезок времени в C# ?


Уважаемый Сэр / Мадам,

Я новичок в программировании на C#.
Я создаю код для связи со своей встроенной системой по протоколу TCP /IP.
существует несколько машин с разным IP-адресом, подключенных к одному ПК.
Я хочу общаться со всеми машинами одновременно, потому что все машинные данные важны.
(все машины равны и имеют одинаковый приоритет).
Я ссылаюсь на многие документы для многопоточности
Но это для процесса основанного на разном времени
Есть ли какой-нибудь способ в многопоточности, с помощью которого я могу сделать так, чтобы несколько потоков могли работать в соответствии с заданным временным срезом(в одно и то же время)?
т. е. предположим, что существует 3 потока с одинаковым приоритетом и заданный временной срез равен 10 мс, то,
Первый поток 1 начало,
через 10 мс поток 1 сохранит свои текущие данные и остановит его, а поток 2 запустится,
через 10 мс поток 2 сохранит свои текущие данные и остановит его, а поток 3 запустится
через 10 мс поток 3 сохранит свои текущие данные и остановит его, а поток 1 запустится
Этот процесс продолжать работать в течение бесконечного времени
Я уже делал этот тип многопоточности во встроенной системе.
Я хочу сделать то же самое в c# в visual studio.
Пожалуйста, дайте мне правильное руководство для этого с помощью примера.

От,
Вишал Акбари

Что я уже пробовал:

В настоящее время я общаюсь только с одной машиной( только один IP или один поток )

Jon McKee

Вы описываете способ, которым многие операционные системы уже планируют задачи на ЦП. Учитывая конкретную платформу, такую как Windows, вы можете использовать SetPriorityClass и SetThreadPriority чтобы обеспечить приоритет задач вашего кода, хотя это не рекомендуется, если у вас нет выделенных систем. Кроме того, вы не можете гарантировать, что ваш код будет выполняться каждые X миллисекунд из-за планирования на уровне ядра. Если такое количество планирования необходимо, вам нужно создать свою собственную квази-ОС, которая работает поверх аппаратного обеспечения. Это чрезвычайно сложная тема, которая выходит далеко за рамки того, что даст ответ QA.

anup.bhunia

Просто идея преодолеть ситуацию...
Создайте три потока, а затем с помощью таймера даже приостановите() и возобновите() поток в циклическом цикле. хотя;
Начиная с .NET 2.0, Suspend и Resume устарели, их использование не рекомендуется из-за опасности, присущей произвольной приостановке другого потока. Если поток, удерживающий блокировку критического ресурса, приостановлен, все приложение (или компьютер) может оказаться в тупике. Это гораздо опаснее, чем вызов Abort — который приводит к тому, что любые такие блокировки освобождаются (по крайней мере теоретически) в силу кода в блоках finally.

2 Ответов

Рейтинг:
2

Dave Kreskowiak

Это не имеет ничего общего с C#.

Вы не можете сделать это в Windows. Windows не дает вам возможности указать, сколько времени каждый поток должен работать, прежде чем отказаться от контроля. То есть управляется исключительно по усмотрению Windows. Вы можете немного повлиять на него с помощью приоритета потока, но это все.

Кроме того, вы не учитываете тысячи других потоков, запущенных в системе, которые не имеют никакого отношения к вашему процессу. Windows, выполняющая эти потоки, может и будет приостанавливать все потоки ваших процессов во время их выполнения. По сути, ваше приложение вообще ничего не делает, в то время как другие потоки в системе выполняются.

У вас просто нет такой детализации под окнами.


Jon McKee

Я хотел бы отметить, что у вас нет такого уровня детализации ни с одной современной ОС afaik. Лучшее, на что вы можете надеяться в Windows,-это злоупотребление уровнем приоритета процесса/потока в реальном времени/критическим по времени. Даже тогда вы не можете гарантировать планирование.

Рейтинг:
1

Foothill

Многопоточность так не работает и не может работать. Когда дело доходит до многопоточности, есть два основных, широко используемых подхода; запустил и забыл или пул потоков. Метод «выстрелил и забыл» предназначен для тех случаев, когда у вас есть длительные автономные задачи, которые будут взаимодействовать с другими частями вашей программы, такими как пользовательский интерфейс, при сохранении скорости реакции программы. Пул потоков лучше всего использовать, когда будет много задач в любом порядке и / или повторяющихся, которые займут больше нескольких миллисекунд, таких как последовательный доступ к базе данных или сетевое взаимодействие. Он поддерживает пул потоков, который может быть запущен для выполнения кода, но не возвращает ресурсы потока обратно в ОС, когда поток возвращается.

Как только поток начинает работать вниз по линии выполнения программы,он не может быть остановлен, если вы вручную не закодируете в точках остановки. Это можно сделать, но не рекомендуется, так как это вызывает множество проблем с синхронизацией. Возможность запуска и остановки потоков в середине выполнения - это контроль уровня ядра системы.

Пул потоков ближе всего к тому, чего вы хотите достичь, но вы не можете произвольно остановить их.

Класс MSDN ThreadPool[^]