|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
||||||
Ошибка в при заполнении Dictionary09.06.2021, 18:47. Показов 1577. Ответов 8
Метки нет (Все метки)
Основной вопрос, почему ошибка?
Конечно нельзя под lock делать async, но это же правило для исключения взаимоблокировок? Сервер выдает данные ордеров по запросам Rest и их изменения по WebSocket. Чтобы всегда были актуальные данные, программа должна начать получать данные по WebSocket, накапливая их в , через 10 секунд сделать запросы Rest, продолжить получать данные по WebSocket до тех пор, пока sequence данного по WebSocket не станет больше sequence данного по Rest. С этого момента данные Rest будут корректироваться с каждым данным по WebSocket. Начал писать программку, но почему-то появляется ошибка.
0
|
||||||
| 09.06.2021, 18:47 | |
|
Ответы с готовыми решениями:
8
Ошибка при заполнении коллекции Dictionary "Ключ отсутствует в словаре" при заполнении Dictionary из файла Ошибка при заполнении |
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
|
| 09.06.2021, 19:34 [ТС] | |
|
А если использовать не Task и async, а потоки, то можно под lock запускать несколько потоков и с кодом, который должен выполнится после их завершения?
0
|
|
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
|
| 09.06.2021, 19:55 [ТС] | |
|
А Mutex вместо lock можно использовать? Это пока не дописали код, позволяющий под lock использовать await или здесь что-то принципиальное, что позволяет потоки использовать, а задачи нет?
0
|
|
|
|
|
| 09.06.2021, 20:03 | |
|
Fylhtq05, Mutex - нет
Тут дело не в задачах и потоках, а в async/await механизме. Нет гарантии, что один и тот же поток не сможет завладеть локом дважды, как и гарантии того, что после await код выполнится в том потоке, который изначально завладел локом. Добавлено через 3 минуты А вообще, не проще ли избавиться от общего ресурса, того самого DicOrderbook, и не городить всей этой ерунды? В чем сакральный смысл этого словаря в поле, если он заполняется один лишь раз?
1
|
|
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
||||||
| 10.06.2021, 15:07 [ТС] | ||||||
|
Избавиться от DicOrderbook нельзя. Я показал только начальную часть кода без дальнейшей обработки, поэтому и кажется, что он не нужен. Смысл в следующем. Словарь хранит для каждого символа актуальные данные (набор действующих ордеров по каждому символу). Этот набор, OrderBook по каждому символу обновляется очень часто, несколько раз в секунду: какие-то ордера удаляются, какие-то частично исполняются, какие-то выставляются. Все данные этого набора, которых много для каждого символа можно получить делая запрос REST, т.е. объект HttpClient делает запрос, получает ответ и дальше после десериализации получается OrderBook (тот самый набор ордеров). Делать часто такие запросы означает сильную загрузку сервера. Поэтому сервер посылает по WebSocket изменение OrderBook, как только это изменение происходит. Эти изменения программа вносит в имеющийся OrderBook каждого символа, каждый раз при приходе по WebSocket этих изменений и дальше начинается основная работа с актуальным OrderBook, содержащегося в словаре для каждого символа.
Переписал код:
Я написал не асинхронную программу: запросы Rest делаются в цикле не асинхронно. Т.к. это долго (надо ждать когда будет получен ответ от предыдущего запроса) переполняется буфер (то ли у меня, то ли у провайдера) данными по WebSocket, если символов, которым соответствует каждый OrderBook больше 30. И вот сделать одновременный запрос по HttpClient по более 50 символам, т.е. более 50 запросов одновременно, на это время блокируя данные WebSocket ( но так, чтобы блокируемые данные получить после выполнения запросов, т.е. чтобы блокируемые данные не исчезли), пока не могу. Не получилось с Async и не получается с Thread.
0
|
||||||
|
|
||
| 12.06.2021, 00:00 | ||
|
1
|
||
|
Модератор
|
|||||||
| 12.06.2021, 12:29 | |||||||
|
Ключи добавляются в DicOrderbook по одному. Вы хоть как это оформите, закодируйте - вы ничего этим не измените. Всё что вы экономите это время запроса = await GetOrderBook(v);.Ну, так и получите все данные асинхронно но в словарь их добавьте синхронно. Примерный код:
GetOrderBook(...).Если такой гарантии нет, то вполне возможны исключения, или когда в ответ на один запрос будет приходить ответ от предыдущего или следующего. Добавлено через 1 минуту Судя по описанию вашей проблемы у вас происходит именно путаница в ответах при асинхронной отправке единовременно множества запросов.
1
|
|||||||
| 12.06.2021, 12:29 | |
|
Помогаю со студенческими работами здесь
9
Ошибка при заполнении массива Ошибка при заполнении DataGridView Ошибка при заполнении массива Ошибка при заполнении массива Ошибка при выводе Dictionary в DataGridView Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|