|
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
|
|
Многопоточность в Windows Service20.06.2018, 12:15. Показов 3905. Ответов 25
Метки нет (Все метки)
Добрый день.
Дали задание переписать простую Windows Form в Windows Service. Windows Form была заточена на то чтобы все события обрабатывались в главном UI потоке. Для этих целей использовалось "InvokeRequired/BeginInvoke/Invoke". В Windows Service нету UI, но переписывать логику будет крайне накладно. Какие есть методы чтобы события из второстепенных потоков обрабатывались в главным потоке?
0
|
|
| 20.06.2018, 12:15 | |
|
Ответы с готовыми решениями:
25
Service для Windows Windows service + WiX Windows Service C# |
|
14315 / 9401 / 1355
Регистрация: 21.01.2016
Сообщений: 35,453
|
||
| 20.06.2018, 13:13 | ||
|
0
|
||
|
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
|
|
| 20.06.2018, 13:30 [ТС] | |
|
Usaga, мне для начало надо понять как в Windows service из второстепенного потока вызвать событие которое будет обрабатываться в главном потоке. Я пока это найти не могу.
В Windows form было так, InvokeRequired проверяю, главный это поток или нет и если не главный то вызываю событие в главном потоке. Как это реализовать?
0
|
|
|
14315 / 9401 / 1355
Регистрация: 21.01.2016
Сообщений: 35,453
|
|
| 20.06.2018, 13:36 | |
|
fufel, а это надо? Я имею в виду, что диспетчеризация требовалась самой Windows при работе с UI. У служб нет UI, значит и диспетчеризация нафиг не нужна. Разве что, нужно следить, чтобы не было
thread racing, но это проблема исключительно вашего кода, и она актуальна везде.
0
|
|
|
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
|
|
| 20.06.2018, 13:52 | |
|
fufel, потокобезопасные коллекции, средства синхронизации потоков, блокировка ресурсов. Всё это легко гуглится по запросам типа "C# синхронизация потоков".
0
|
|
|
|
||
| 20.06.2018, 14:36 | ||
|
Как-то странно, ведь инвокер на формах нужен исключительно для обращения к UI єлементам. Если вьі завязьівали на єто еще и логику синхронизации, то....
0
|
||
|
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
|
||
| 20.06.2018, 15:05 [ТС] | ||
|
Wolfdp, aquaMakc, Usaga,
Сейчас попробую описать часть кода словами чтобы было ясно к чему всё это. 1) В отдельном потоке живёт TCPListener который принимает сетевые соединения. При приёме нового соединения генерирует событие которое передаётся главному (UI) потоку. Главный потов обрабатывает новое соединение и создаёт TCPClient который запускается в новом потоке. 2) Когда TCPClient получает сообщение он генерирует событие которое передаётся главному потоку. В результате, вся логика происходит в главном потоке и в результате чего мне не надо думать о целостности данных поскольку всё происходит в одном потоке. Форма принимала события от других потоков и выполняла все действия. П.С. Почему я так делаю. На данный момент я знаю что когда событие на форме отработала (Скажем нажатие кнопки) то форма (Поток) не исчезает а ждёт других действий. В тоже время если создавать свой поток то после обработки поток закрывается. И как сделать так чтобы поток уходил в ожидание событие из другого потока я не знаю. Добавлено через 9 минут Вопрос мой в том как в Windows service в втором потоке создать событие которое будет обрабатываться в главном потоке?
0
|
||
|
|
|
| 20.06.2018, 15:06 | |
|
0
|
|
|
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
|
|||
| 20.06.2018, 15:35 | |||
|
0
|
|||
|
14315 / 9401 / 1355
Регистрация: 21.01.2016
Сообщений: 35,453
|
||
| 20.06.2018, 16:21 | ||
|
Вам не нужен никакой "главный поток". Запускайте прослушку порта в отдельном потоке, при получении нового соединения запускайте его обработку в новом потоке (берите из пула). Ни какой завязки на "главный поток" тут не нужно вообще.
0
|
||
|
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
|
|||||||||||||
| 20.06.2018, 16:28 [ТС] | |||||||||||||
|
2) Обработка события в главной форме. Главный поток создаёт нужный класс, подписывает события и командой "Klient.Start()" отправляет в путь (Данная команда создаёт другой поток в котором живёт данный созданный объект).
А теперь по проблеме, вот пример кода. В скобках указанны ID потоков в которых они выполняются. ID 10 - Главный поток. ID 11 - Второстепенный поток. Вопрос в том что как метод "private void XXX_Mehod(object sender, EventArgs e)" запустить не с 11 потока (именно в 11 потоке был вызвано событие) а чтобы обработка события вызванная в 11 потоке обработалось в 10 потоке?
0
|
|||||||||||||
|
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
|
|||||
| 20.06.2018, 16:36 | |||||
|
0
|
|||||
|
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
|
||
| 20.06.2018, 16:37 [ТС] | ||
|
Пока вопрос в том как мне из других потоков (их может быть 10) генерировать события так чтобы обработка всех событий происходила исключительно в одном и том же потоке?
0
|
||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
|
|
| 20.06.2018, 16:48 | |
|
0
|
|
|
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
|
||||||||||
| 20.06.2018, 17:16 [ТС] | ||||||||||
![]()
П.С. я знаю что делаю не правильно, но это мой первый большой проект. И в нём я сделал большое количество ошибок. Не судите строго. Просто помогите мне. Сейчас спустя полтора года я уже понял что такой потокобезопасные коллекции/Lock/семафоры. Но тогда когда всё начинал изучать я про события не чего не знал и про отдельные потоки. И про унаследование классов тоже не знал. Но нельзя сесть за C# и начать с ходу писать всё как надо. Всё изучал на коленках, всё познавал при помощи проб и ошибок. И то что вышло (Криво, боко, страшно с точки зрения программирование) работает и работает хорошо. Просто надо переделать на Windows Server а не переписывать всё с нуля по всем догмам программирования чтобы потом опять понять что всё что я писал опять не правильною.
0
|
||||||||||
|
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
|
||||
| 20.06.2018, 17:26 | ||||
|
0
|
||||
|
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
||
| 20.06.2018, 17:26 | ||
За lock уже сам компилятор бьёт по шаловливым ручкам, а с Mutex и Monitor уже возможны интересные приключения )) Как раз пишет Stephen Cleary, человек и пароход: https://msdn.microsoft.com/mag... 2147217396
0
|
||
|
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
|
||
| 20.06.2018, 18:41 [ТС] | ||
|
Ладно ребята, всем спасибо за уделённое ваше внимание. И так помогли )))
Буду читать те ссылки которые вы дали, и буду дальше решать свою задачу. Если посмотриш на картинку то там выходит такое дело. Есть центр, он центра надо сделать 4 шага чтобы попасть в обведённую кругом точку. Черный цвет это твой решение, оно идеально, оно превосходно. Я сделал так как я смог (Зелёный цвет). Затратил больше шагов, с самого начала сделал первый шаг совсем в другую сторону но я смог дойти до нужной точки, и хоть через зад но всё прекрасно работает. Но показав своё решение я получаю выше стоящий ответ. И что мне теперь делать? всё откатывать назад и пытатся найти другой (более вернее путь)? так я могу сделать три попытки (Желтый цвет) и все попытки уйдут в молоко. И что мне остаётся делать? Так как я сделал (работает) но это очень плохо, а как надо негде взять. Это относится и к второму комментарию, я прекрасно понимаю что делаю через з*д но нету у меня во круге тех кто может мне сказать как надо делать. Есть google, вы и моя задача. amr-now, намотал на ус, почитаю и попробую сделать правильные выводы (не шагнув на желтую линию), и буду дальше решать свою задачу.
0
|
||
|
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|
| 20.06.2018, 19:12 | |
|
fufel, ну тут уж насколько позволит здоровье.
Тему concurrency не бросайте. Она сейчас новая и модная. Даже устоявшегося перевода не имеет. Concurrency - одновременное или псевдоодновременное выполнение различных частей программного кода; или одного кода для разных данных. Является обобщенным понятием для параллельного, многопоточного, асинхронного программирования. Как теория действует и для C#, и для Java, и для JavaScript. Так что в любом случае тему надо знать. Вьётся вокруг страшных слов Rx, Promise и тд. ----- Так что на одних Invoke() свет клином не сошелся ))
0
|
|
|
14315 / 9401 / 1355
Регистрация: 21.01.2016
Сообщений: 35,453
|
|
| 20.06.2018, 19:41 | |
|
fufel, хороший совет "как надо" начинается с полного описания задачи и мотивации, которая привела к вопросу. Вникать и расписывать решение вопроса, который уже изначально было понятно, что решает кривую задачу (привязки к "главному потоку" в службе, где это не играет роли) - дело бесполезное. Поэтому всё и свелось к фразам "так вообще не делается" и "это фигня и через зад".
Собственно, вам озвучили, что вы ищете решение несуществующей проблемы. XY problem. Так, что диаграмма выше как-то тут не вяжется. Уж извините.
0
|
|
| 20.06.2018, 19:41 | |
|
Помогаю со студенческими работами здесь
20
Сервер на Windows service A Windows service with the name MySQL already exists. Please uninstall this service correctly or choose a different name for the new service. Windows Service Manager Tray , Windows Service Manager (SrvMan) информация Как переделать Windows Forms приложение в Windows Service с UI? Оболочка BASH в Windows (Windows Service for Linux) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html
Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
|
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|