0 / 1 / 0
Регистрация: 06.12.2020
Сообщений: 24
|
||||||
1 | ||||||
Как отследить когда завершатся все 254 или больше, потока и после этого вывести результат их работы на экран07.12.2020, 12:02. Показов 3613. Ответов 44
Метки нет Все метки)
(
при создании потока counter++, при завершении потока counter--, параметр counter меняет значение в итоге должно получиться НОЛЬ и тогда выполниться вывод результатов.
вот так я пробовал решить задачку но, часто counter не спускается до нуля, а если раньше времени начать вывод результатов, мой ПК было много раз во время тэстов показывал СИНИЙ ЭКРАН СМЕРТИ ![]()
0
|
|
07.12.2020, 12:02 | |
Ответы с готовыми решениями:
44
Как вывести на экран результат работы программы Как результат работы программы вывести на экран Как вывести результат работы кода на экран? (файловый ввод/вывод)
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
|
07.12.2020, 12:36 | 2 |
![]() Решение
newest newbie, операции ++ и -- не атомарные. Если два потока одновременно, например, отнимут значение, то в итоге может получится -1, а не -2.
https://docs.microsoft.com/en-... ew=net-5.0 https://docs.microsoft.com/en-... s/volatile Вирусы, неправильно драйвера стоят, еще чего. В коде нет ничего, чтобы кидало крит системе.
1
|
626 / 390 / 135
Регистрация: 06.03.2017
Сообщений: 1,455
|
|
07.12.2020, 12:38 | 3 |
зачем вам столько потоков??? Лучше уже сделать все в один отдельный поток.
0
|
Пора на C++?
369 / 263 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
|
|
07.12.2020, 12:38 | 4 |
0
|
0 / 1 / 0
Регистрация: 06.12.2020
Сообщений: 24
|
|
07.12.2020, 13:17 [ТС] | 5 |
0
|
626 / 390 / 135
Регистрация: 06.03.2017
Сообщений: 1,455
|
|
07.12.2020, 13:23 | 6 |
Быстрее, чем создавать 254 потока и ждать их окончания. Создание потока операция не самая дешевая. Я бы разделил все это не более чем на 4 потока.
1
|
0 / 1 / 0
Регистрация: 06.12.2020
Сообщений: 24
|
|
07.12.2020, 13:41 [ТС] | 7 |
0
|
Модератор
![]() |
||||||
07.12.2020, 14:26 | 8 | |||||
В современном C# явное создание потоков (Thread) используется крайне редко.
Для асинхронного исполнения используются задачи (Task). Часто в сочетании с async/await, чтобы не лагал GUI. Сильно в логику не вникал и пишу здесь без Студии, но примерно так (без async/await):
1
|
0 / 1 / 0
Регистрация: 06.12.2020
Сообщений: 24
|
||||||
07.12.2020, 19:12 [ТС] | 9 | |||||
программма зависает на долго.
если добавить вывод в listbox1 комп умирает, незнаю с чем это связано. мой вариант без зависаний выдает результат за пару секунд, спасибо помог I2um1 добавил пару строк
0
|
Модератор
![]() |
|
07.12.2020, 19:51 | 10 |
У вас какой-то непонятный Слип стои - я не знаю для чего и не стал его убирать.
Но он создаётся в каждом цикле и будет значительно подвешивать общее выполнение метода. А он выполняется в основном потоке и GUI, естественно, будет лагать. По нормальному надо делать через async/await, но не я не совсем понял логику, поэтому переделывать не стал. Добавлено через 2 минуты Так нельзя делать. Вы пишите в List<string> LstIp из разных потоков.А List - это не потокозащищённая коллекция. Обязательно будут потери данных. Добавлено через 1 минуту newest newbie, ответь для чего у вас там стоит слип?
0
|
958 / 576 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
|
||||||
07.12.2020, 20:28 | 11 | |||||
хак который позволяет разблокировать основной поток
Добавлено через 5 минут нужно заменить на:
1
|
Модератор
![]() |
||||||
07.12.2020, 20:47 | 12 | |||||
Попробуйте такой код.
Промежуточный список убран. Результат пишется сразу в листбокс. Ожидание исполнения всех задач убрано. Каждая задача по окончании сама записывает свои результаты в листвох через Invoke. Так как все Invoke выполняются в одном потоке, дополнительной защиты не требуется.
Слип делает блокирующее ожидание. Не блокирующее - это Task.Delay(123).Wait(); .Добавлено через 1 минуту Этот список зачем вообще нужен? Если только для вывода в листбокс, то надо сразу выводить.
1
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
||||||
07.12.2020, 20:50 | 13 | |||||
Есть же проще вариант:
0
|
Модератор
![]() |
|
07.12.2020, 20:59 | 14 |
Это возможно только в асинхронном методе.
Но в данном случае, слип, вообще, излишен. ТС его ставил для разблокировки UI потока, так как методы выполнялись синхронно в нём. Если выполнять их в задачах, то в нём потребности нет. Добавлено через 1 минуту Я в коде закомментировал эту строку.
0
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
|
07.12.2020, 21:11 | 15 |
Так там все равно нужно использовать асинхронную отправку и я же два варианта написал, первый - синхронный. В такой реализации и список тасков не нужен, но я не знаю насколько оправдано 254 раза делать
Invoke .
0
|
Модератор
![]() |
|
07.12.2020, 21:25 | 16 |
Только если каждый пинг буде очень по разному возвращаться.
А вывод результата каждого пинга нужен сразу. Добавлено через 51 секунду Я прислал такой вариант, так как не понял причину по какой у ТС долго работает вариант с ожиданием завершения всех задач.
0
|
958 / 576 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
|
|
07.12.2020, 22:01 | 17 |
Проще использовать Parallel.For
Добавлено через 3 минуты Да вы правы, я вспомнил что Thread.Sleep(1); используют для разгрузки процессора(чтобы программа позволяла и другим процессам достучаться до CPU).
0
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
|
07.12.2020, 22:01 | 18 |
uzhsoft, я ждал веселую реализацию async foreach. Но ладно, Parallel.For действительно проще, наверное.
0
|
Модератор
![]() |
||||||
07.12.2020, 22:36 | 19 | |||||
Здесь нет ни какого ожидающего исполнения.
Надо просто запустить задачи и отправить их "в свободное плавание". Зачем лишние усложнения с await, с Parallel.For? Если и использовать Parallel то ForEach:
1
|
Злой няш
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
|
||||||
07.12.2020, 23:47 | 20 | |||||
Зато как забавно выглядит и не нужен отвратительный Invoke:
Ну~, этот код замораживает UI, так и не дождался разморозки. Точнее, оно иногда размораживается на долю секунды и снова замораживается.
0
|
07.12.2020, 23:47 | |
Помогаю со студенческими работами здесь
20
После двух месяцев работы 1с тормозит все больше и больше
Синий экран смерти когда компьютер нагревается или загрузка ЦП больше 80% Даны натуральные числа N, K, L (K<L). Вывести на экран все делители числа N, которые меньше K или больше L После создания потока не заходит в функцию этого потока Вывести результат работы программы на экран Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |