Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103

Поток в настоящее время используется предыдущей версией потока

27.10.2024, 00:31. Показов 4878. Ответов 64
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые программисты! Писал клиент и сервер. Идея такова, что выбирается listView элемент, затем нажимается кнопка Button1 и сервер отправляет на клиента команду, клиент принимает ее и в ответ шлет сначала эту же команду, затем число строк из своего listView, а затем в цикле пересылаются все строки. Так вот, при первом нажатии срабатывает нормально, результат можно видеть на картинке, а при втором нажатии вылезает ошибка из названия темы. Помогите, кто может, как избавиться от этой ошибки? В архиве прикрепляю проекты Visual Studio клиента и сервера.
Миниатюры
Поток в настоящее время используется предыдущей версией потока  
Вложения
Тип файла: 7z Клиент - Сервер.7z (168.6 Кб, 8 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.10.2024, 00:31
Ответы с готовыми решениями:

В некоторых странах Дальнего Востока (Китае, Японии и др.) использовался (и неофициально используется в настоящее время)
В некоторых странах Дальнего Востока (Китае, Японии и др.) использовался (и неофициально используется в настоящее время) календарь,...

В некоторых странах Дальнего Востока (Китае, Японии и др.) использовался (и неофициально используется в настоящее время)
В некоторых странах Дальнего Востока (Китае, Японии и др.) использовался (и неофициально используется в настоящее время) календарь,...

Какие на ваш взгляд ОС Windows являются провальными по сравнению с предыдущей версией и почему?
Всем доброго времени суток уважаемые, пользователи, администрация и гости форума. У меня такой вопрос. Какие на ваш взгляд ОС Windows...

64
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
08.11.2024, 20:10  [ТС]
Студворк — интернет-сервис помощи студентам
Wolfdp, Вы хорошо все расписали, но боюсь, что не в моих силах реализовать что-то подобное
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
09.11.2024, 07:52
Цитата Сообщение от Оаг Посмотреть сообщение
но боюсь, что не в моих силах реализовать что-то подобное

Не по теме:

Волков бояться, в лес не ходить.


С чем сложности? Разбить на потоки? Никапсулировать подключение к конкретному клиенту в отдельный класс? Создать потокобезопансую коллекцию? Передать её по ссылке в другой класс для бизнес логики?
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
10.11.2024, 06:09  [ТС]
Wolfdp, Что такое фабрика, потокобезопасная коллекция, агрегатор, MQ, Handlers?
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
10.11.2024, 11:18
Цитата Сообщение от Оаг Посмотреть сообщение
Что такое фабрика
Класс, который на основе входных параметров создает нужный объект. В нашем случае нам нужно создать ClientObject (я бы таки рекомендовал назвать ClientSession или ещё как, а то object -- ну прям ноль инфы что это такое) на основе TcpClient. Можно просто вызвать конструктор и передать нужные вещи в него из класса, где крутиться сам listener. Но тогда в нём нужно также держать элементы, которые нужны исключительно для создания ClientObject (например список Handlers или туже MQ). Фабрика позволяет "запаковать" логику создания в отдельный класс, упростив вызов в местах где непосредственно нужно создать элемент. Ещё сильнее раскрывается такой подход, когда в проекте есть ioc-контейнер, отвечающий за DI, но подозреваю что сейчас вы это изучать не согласитесь.

Конкретно фабрику можно и не делать, не самый критичный элемент.

Цитата Сообщение от Оаг Посмотреть сообщение
потокобезопасная коллекция
Потокобезопасные коллекции. Читаем, разбираем и после применяем. Вот это прям супер обязательно, иначе в противном случае ПОСТОЯННО БУДЕТЕ ЛОВИТЬ БАГИ.

Также всегда можно обернуть нужную логику аля List (Add, Remove, ForEach) в свой кастомный класс, который внутри будет всё выполнять через тот же lock, аще лучше ReadWriteLock.

Цитата Сообщение от Оаг Посмотреть сообщение
агрегатор

Не по теме:

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


Если на пальцах:
- разбиваем весь скоп задач на логические группы (например сохранение данных в БД/файл; обработка данных; мониторинг; формирование запросов внешнему API).
- всё это инкапсулируется по отдельным классам. Т.е. за сохранение в БД должен отвечать только один класс, и он должен уметь только сохранять в БД (можно дополнительно раздробить по таблицам).
- есть "супер класс", который будет инициализировать все эти объекты, стартовать их работу и обеспечивать взаимодействие друг-с-другом через подписки на event или передачу в конструктор/свойства

В идеале такого нужно избегать, но для этого нужен ioc-контейнер.

Цитата Сообщение от Оаг Посмотреть сообщение
MQ
Message Queue. Это очень мощный подход, когда у вас есть набор входящий сообщений из разных источников при этом есть очень много разных подписчиков на эти сообщения. TCP/UDP соединение по своей сути -- канал присылающий сообщения. А значит нам можно ввести подписчиков на эти сообщения, которые как-то будут на это реагировать. Как пример, вам из соединения от клиента может приходить два типа сообщения:
- я сменил статус на "красный/синий"
- запрос "какой статус у остальных?"

Допустим изначально нам нужно просто запоминать какой у клиента статус и отправлять по запросу общий статус. Значит у нас два подписчика:
- тот который возьмёт текущего клиента и поменяет ему статус
- тот который посмотрит общий список и ответит клиенту

Через время решили логировать. Тупо добавляем подписчика на первое сообщение и пишем в БД.
Через время решили что если все перешли в статус "красный" -- отправляем уведомления по email. Плюс один подписчик, который никак не задевает уже существующие.

Можно обойтись и без него.

Цитата Сообщение от Оаг Посмотреть сообщение
Handlers
Набор обработчиков входящих сообщений. Можно применить вместе с MQ, можно и отдельно. Как писал выше -- вся суть что у вас есть входящее сообщение, которое вы скармливаете такому обработчику, и он уже знает что с ним делать. Основная идея -- отделить считывание пришедшего сообщения от его обработки. В противном случае добавление/изменение логики для каждого отдельного сообщения будет проходить больно.
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
12.11.2024, 00:01  [ТС]
Wolfdp, Прочитал про потокобезопасные коллекции. И какую из них использовать? ConcurrentBag<T>? И в нее должны закидываться clientobject (session)?

Добавлено через 19 минут
И все-таки, мне интересно, как например на предприятии разворачивать подобную систему. Есть например 250 клиентских ПК и 1 сервер. Это надо заставить сисадмина оббежать все 250 ПК и там вбить в настройки IP-адрес сервера везде?
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,580
12.11.2024, 00:15
Цитата Сообщение от Оаг Посмотреть сообщение
Это надо заставить сисадмина оббежать все 250 ПК и там вбить в настройки IP-адрес сервера везде?
Нет, только в бухгалтерию. В остальных отделах сами справятся, если им IP по внутренней почте скинуть.
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
12.11.2024, 03:57  [ТС]
Пытаюсь вызвать tcpListener?.Dispose(); и визуал студио пишет ошибку: tcpListener не содержит определения Dispose, и не удалось найти доступный метод расширения Dispose, принимающий тип tcpListener в качестве первого аргумента.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
12.11.2024, 05:09
Цитата Сообщение от Оаг Посмотреть сообщение
И какую из них использовать?
ConcurrentDictionary

Цитата Сообщение от Оаг Посмотреть сообщение
Это надо заставить сисадмина оббежать все 250 ПК и там вбить в настройки IP-адрес сервера везде?

Не по теме:

Ага, а когда выпускают онлайн игру, специальный посыльный на специальных гончих собаках оббегает всех игроков, что устанавливают клиент себе на ПК и прописывает им IP игрового сервера.



IP прописывается в настройках. Настройки нужно делать так, чтобы клиент мог их подправить самостоятельно. Более кошерный подход указывать не IP, а доменное имя (услуга чаще платная). Дабы упростить себе жизнь, в проектах C# существует понятие "конфигурация" и по умолчанию создаются две: DEBUG и RELEASE. Для них можно прописать две независимые настройки, которые будут применяться автоматически. Как результат, пока вы разрабатываете, то ссылаетесь скажем на 127.0.0.1, а когда делаете финальный билд для рассылки бухам -- просто переключаетесь на RELEASE и отдаете соответствующий файл.

Цитата Сообщение от Оаг Посмотреть сообщение
tcpListener?.Dispose()
Если у вас версия Framework (всё что до версии 4.8 без приписки Core) -- тот там листенер не является Disposeble объектом. И перед тем как спрашивать такое вообще у кого-либо, рекомендую:
- осознанно прочитать что написано.
- глянуть документацию по той версии, которую используете.
- погуглить или использовать AI-чат.

Желательно именно в такой последовательности.
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
12.11.2024, 05:48  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
когда делаете финальный билд для рассылки бухам -- просто переключаетесь на RELEASE и отдаете соответствующий файл.
Как я это вижу. Покупает у моей компании программный продукт другая компания. Они говорят, на какой ip надо сконфигурировать клиенты. Разработчик конфигурирует продукт и отдает бухам, которые отсылают его заказчику. Хотя с точки зрения информационной безопасности это звучит не очень.
Либо второй вариант, что сначала компания покупает продукт, потом у себя конфигурируют на нужный ip-шник и потом клонирует приложение и ставит на свои компьютеры.
По поводу онлайн-игры тоже неизвестно, как оно там работает.
Цитата Сообщение от Wolfdp Посмотреть сообщение
Если у вас версия Framework (всё что до версии 4.8 без приписки Core)
У меня Framework 4.8, без приставки core. Согласен, надо поменьше глупых вопросов задавать
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
12.11.2024, 06:20
Цитата Сообщение от Оаг Посмотреть сообщение
Либо второй вариант, что сначала компания покупает продукт, потом у себя конфигурируют на нужный ip-шник и потом клонирует приложение и ставит на свои компьютеры.
Стратегия развертывания может подразумевать необходимость сисадмина или девопса. Нередко нужны вообще непосредственно разработчики. Есть те или иные механизмы упрощения, но волшебной кнопки "запустить и забить" не существует. Серверная часть в 99.999% случаев требует настроек в том или ином виде. Клиентская -- либо подготовки инсталера, либо пошагового мануала по установке, либо специального конфигурационного файла (всякие VPN-клиенты работают по последнему принципу).

Самый простой способ -- написать подробную инструкцию на всё и вся.
Чуть кошерней -- выделить техподдержку.

Не по теме:

Цитата Сообщение от Оаг Посмотреть сообщение
Согласен, надо поменьше глупых вопросов задавать
Тут не в вопросах проблема, а в том что вы пытаетесь узнать всё и вся через форум. Это долго. Грубо говоря нашли вы пару-тройку человек, которых заинтересовала тема и что-то отвечают. Через неделю и одного дедлайн, у второго отпуск, третий просто забил. А вы по инерции ждете ответа.

Рассматривайте форум как "последняя инстанция", когда сами не смогли найти через документацию или простой поиск и AI-чат выдает нерабочую ерунду.

0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
12.11.2024, 13:05
Цитата Сообщение от Оаг Посмотреть сообщение
заставить сисадмина оббежать все 250 ПК
хороший сисадмин никуда не бегает (и хрен заставишь!). У сисадмина есть куча инструментов для удаленного управления и настройки ПК на предприятии.
0
12.11.2024, 17:14

Не по теме:

Цитата Сообщение от wizard41 Посмотреть сообщение
хороший сисадмин никуда не бегает (и хрен заставишь!). У сисадмина есть куча инструментов для удаленного управления и настройки ПК на предприятии.
Проблема не столько в беге. Даже если установка будет подразумевать "запуск - далее - далее - готово", то 250 ПК за 8 часов будут требовать не более 2 минут внимания, что несколько напряжно. А значит начнет задумываться об групповых политиках, и какого тот же майкрософт берет бабло за серверные редакции.

Если говорить про подготовку софта, то как писал выше: либо править файл конфигов, либо собирать нужный msi. Как вариант можно на вход установщика передавать набор необязательных параметров, которые пропишут в конфигах нужное.

0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
12.11.2024, 17:49
Wolfdp, в целом то согласен.
Просто, относительно автора вопроса существуют трудности в виде весьма малых знаний в программировании как таковом, не говоря уже о сетевом уровне, меж-поточном взаимодействии. Ну и конечно же, такие вещи как MSI и вообще установщики - темный лес.
Оаг, без обид - честная критика: при первом взгляде только на форму (макет WinForms) с неподписанными кнопками и очень странными размерами/компоновкой элементов, становится ясно, что за среду программирования посадили школьника в первый раз. В этом случае сложновато что-то дельное советовать, вернее, советовать то можно, но эти советы принесут 0.001% пользы. Без хорошей такой базы тут не обойтись, а обучать этому на форуме ессесно вряд ли кто возьмется.
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
12.11.2024, 18:50  [ТС]
wizard41, Это правда, я все понимаю. Касаемо размеров, внешнего вида формы и неподписанных кнопок, я руководствуюсь принципом сначала написать какую-то логику, а потом уже в конце делать как надо, переименовывать controlы и т.д. Да и я скинул очень сырую версию, где только начинал проверять, как все работает. Но вообще с точки зрения реальной коммерческой разработки, я так понимаю, там сразу все делается красиво, но такого опыта у меня нет.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
12.11.2024, 19:36
Оаг, вообще да, принято сперва разработать "модель", т.е. сам фактический алгоритм, а затем на него навешивать "фасад" в виде окна. Такой подход удобен тем, что его можно протестировать любым типом приложения, той же консолью, не имея при этом макета окна как такового.

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

А здесь возникает вторая проблема: нет разделения логики модели от UI-потока. И результаты становятся непредсказуемыми, ну и в целом программа начинает работать не так как ожидалось.

Цитата Сообщение от Оаг Посмотреть сообщение
Но вообще с точки зрения реальной коммерческой разработки, я так понимаю, там сразу все делается красиво, но такого опыта у меня нет.
Лучше сразу привыкать делать правильно. Пусть будет дольше по времени, зато эффективнее в плане дальнейшего обслуживания.
Hello World написал, вывел в окно? 5 + 5 посчитал, результат вывел в TextBox? Все, теперь забывай что делал и начинай делать нормально.
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
12.11.2024, 22:16  [ТС]
Как подключаться до победного, если сервер недоступен? После первого же раза программа останавливается с логичной ошибкой "Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение". Нигде не могу найти пример вызова Connect в цикле или пример обработки этой ошибки.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3461 / 2782 / 575
Регистрация: 04.09.2018
Сообщений: 8,746
Записей в блоге: 3
12.11.2024, 22:40
Оаг, в моем примере пробовал клиента подключать к серверу, когда тот не работает? Снизу просто появится сообщение типа "такого сервера нет..." или что-то в этом роде, не помню. И никаких ошибок нет.
Так вот вместо этого сообщения можно делать задержку и повторять подключение снова... Клиент будет пробовать подключаться к серваку пока материнская плата не сгорит. Или БП.
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
13.11.2024, 06:22
Цитата Сообщение от Оаг Посмотреть сообщение
Как подключаться до победного, если сервер недоступен?
Вводишь флаг "переподключаться автоматически". При любом дисконекте кидаешь свой event Disconnected, который в параметрах будеть иметь необязательное поле Error. Подписываешься на это событие и чекаешь Error. Если есть (в идеале ещё и тип ошибки анализировать, ибо если там "некоректный IP адресс, то долбиться нет смысла") и стоит флаг "автоподключение" -- пинаем таймаут + Connect.

Следует учесть моменты, что юзер вручную может отключать (можно в тех же параметрах Disconnected добавить флаг) и тогда ни в коем случае не должно попадать на обработку переподключения.

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

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Оаг Посмотреть сообщение
а потом уже в конце делать как надо, переименовывать controlы
Контролы это "не как надо", а необходимость на любом уровне. Вы сами то не запутаетесь в всяких textbox1?

1
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
15.11.2024, 06:34  [ТС]
Wolfdp, Понял.
Ну, когда контролов немного, то не запутаюсь. Да и всегда можно двойным кликом тыкать по контролу в конструкторе формы и он перебросит тебя в нужный метод.
0
0 / 0 / 0
Регистрация: 28.02.2020
Сообщений: 103
21.12.2024, 00:48  [ТС]
wizard41, Здравствуйте, вы говорили, что мой метод получения директории exe-файла программы никуда не годится. А как бы вы его реализовали?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2024, 00:48

Описать два потока: первый поток записывает данные в буферную память, а второй поток – считывает
Как написать на языке С программу, которая содержит две функции, описывающие два потока? Первый поток записывает некоторые данные в...

Нужны ли эти теги в настоящее время
Обращают ли поисковики внимание на теги: &lt;meta name=&quot;keywords&quot; content=&quot;&quot; /&gt; &lt;meta name=&quot;description&quot; content=&quot;&quot; /&gt; ...

Захват воспроизведения. Недоступно в настоящее время
Хотел я значит записать звук через захват воспроизведения, раньше (месяца два назад) все записывало, программа видела и в скайп можно было...

Вчера составила $ 15,12, в настоящее время составляет $ 14,82?
адмоб, счёт, вчера составила $ 15,12, в настоящее время составляет $ 14,82 ? почему в минус ???

Немецкий язык. Перфект и настоящее время?
ВОПРОС Изучая перфект, я прочитал следующее примечание. Привожу его дословно. Важно! Перфект в немецком языке в отличие от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru