@Paxorin
Разработчик

Необходимо найти правильный подход к решению задачи на C#?

Добрый день!
Есть некий тренажер, работающий в локальной сети и обменивающийся данными по бродкасту. В этот тренажер нужно добавить карты, не трогая сам тренажер, и отображать мобильные объекты.
Приложение с картами поднимает сокеты в той же локалке и по udp принимает нужные пакеты с данными(координаты и т.д) подвижных объектов ~ раз в секунду, десериализует данные и отображает изменения на карте.
Опыта в с# мало, поэтому возникаю трудности как организовать флоу такого приложения, чтобы не грузить основной поток, где сама карта.
Примерный план такой:
1. Приложение поднимает несколько сокетов через Task.Run() и постоянно(while true) принимает udp пакеты. В этих же task пакет десериализуется и добавляется в ConcurrentQueue.
2. Через Task.Run() еще один поток постоянно пытается извлечь из ConcurrentQueue в случае успеха извлекает из очереди данные, подготавливает карты к обновлению и каким-то образом сообщает основному потоку чтобы тот обновил карту.
3. Основной поток обновляет карту.
Вопросы:
1.Правильно ли я понял что CPU-bound код лучше отправлять в Task.run()?
2. Не избыточна ли тут ConcurrentQueue?
3. Как сообщить основному потоку из Task.run() что все готово к обновлению карт? Я понимаю что есть Task.Result, но если Task выполняется постоянно (while true), смогу ли я это использовать?

Ну или мой план вообще не туда и есть более изящное решение с учетом вышеописанного?
Может кто-то поделится похожим примером, буду очень благодарен.
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
2. Не избыточна ли тут ConcurrentQueue?


Вместо неё лучше использовать System.Threading.Channels (https://www.stevejgordon.co.uk/an-introduction-to-...)
3. Как сообщить основному потоку из Task.run() что все готово к обновлению карт? Я понимаю что есть Task.Result, но если Task выполняется постоянно (while true), смогу ли я это использовать?

При помощи канала.
А Task.Result испольщовать не следует

В остальном всё звучит правдоподобно
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы