Необходимо найти правильный подход к решению задачи на 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), смогу ли я это использовать?
Ну или мой план вообще не туда и есть более изящное решение с учетом вышеописанного?
Может кто-то поделится похожим примером, буду очень благодарен.
3. Как сообщить основному потоку из Task.run() что все готово к обновлению карт? Я понимаю что есть Task.Result, но если Task выполняется постоянно (while true), смогу ли я это использовать?
При помощи канала.
А Task.Result испольщовать не следует