|
В экстазе
|
|
.NET 4.x Прервать несколько потоков04.05.2015, 08:48. Показов 3242. Ответов 19
Метки нет (Все метки)
Доброго времени суток уважаемые!
Подскажите пожалуйста, как правильно решить следующую задачу: выполнить некоторый метод в разных, не зависимых друг от друга потоках. Потом при необходимости, в какой-то момент времени эти потоки максимально быстро прервать/убить (и вынести их трупы куда-нибудь подальше ), потом, в какой-то момент времени запустить новые потоки... и т.д.Интересует максимально простой пример, по возможности с комментариями. Спасибо.
0
|
|
| 04.05.2015, 08:48 | |
|
Ответы с готовыми решениями:
19
Несколько асинхронных потоков Функция в несколько потоков Разбить цикл на несколько потоков |
|
|
|||
| 04.05.2015, 08:58 | |||
0
|
|||
|
В экстазе
|
||
| 04.05.2015, 09:04 [ТС] | ||
|
1. В методе может выполняться сторонний, независимый код, загруженный из какой-то "левой" сборки 2. В какой-то момент, метод может просто "зависнуть" на какой-то операции (в т.ч. это может быть напрямую связано с п.1)
0
|
||
|
|
|
| 04.05.2015, 09:09 | |
|
wolfalone, сборка управляемая? Ее код доступен?
Можно сделать определенный таймаут, за который код внутри метода должен завершиться. Если нет - то выход из метода. В любом случае, вызова Abort() для потока нужно избегать. Это плохая практика.
0
|
|
|
В экстазе
|
||||||
| 04.05.2015, 09:46 [ТС] | ||||||
|
insite2012, вопрос носит скорее риторический характер, нежели иллюстрирует какой-то конечный (строго определённый) пример. Но, давайте, для примера, предположим, что мы загрузили некоторую сбоку, с управляемым кодом, исходника которой у нас нет и не может быть в принципе, т.к. она загружается из сети.
У этой сборки есть некоторый метод, выполнение которого выглядит примерно так:
Давайте попробую привести какой-то более жизненный пример... Где-то в анналах сети, лежит периодически обновляемая сборка, за обновление которой отвечает сторонний не известный мне разработчик. Я загружаю эту сборку, основной задачей которой является, парсинг веб-страниц (очень большого их количества), с множеством данных... Процесс занимает достаточно продолжительное время, но, при этом есть высокая вероятность, что сайт с которого мы собираем информацию - в какой-то момент времени перестанет работать, отдавать страницы или с ним произойдёт ещё что-то "нехорошее"... За мониторинг сайта, отвечает работающий в отдельном потоке "монитор", и вот от монитора пришла информация, что сайт "того" (отвалился). Что бы не терять времени, нам нужно начинать обрабатывать собранные данные, до тех пор пока от "монитора" снова не придёт сообщение, что сайт снова доступен и можно продолжать его парсинг (загрузку страниц с него)... При этом, обработчик запускает тоже в 10-и, т.к. нагрузка одного процесса-обработчика на процессор минимальная, а нам нужно использовать ресурсы машины по максимуму. Соответственно, когда от "монитора" пришло сообщение, что сайт снова доступен - мы прерываем процессы-обработчики (загруженные так же, из "сетевой" сборки) и запускаем процессы-сборщики. Что хранится в сборках, которые мы загружаем и как именно они там работают, мне не известно (по условиям задачи). Я имею в виду, внутренний алгоритм их работы.
0
|
||||||
|
|
||||
| 04.05.2015, 09:56 | ||||
|
wolfalone, чудится мне, что вопрос вы поставили немного не так. Итак, по порядку.
Добавлено через 2 минуты P.S. Сделать вам к-либо конкретный пример у меня нет возможности, поскольку логики работы того кода, который вы намереваетесь использовать я не знаю, и самих адресов сайтов тоже. Поэтому только высказал общий принцип.
0
|
||||
|
В экстазе
|
||
| 04.05.2015, 10:06 [ТС] | ||
|
Возможно, я где-то не так выразился или упустил основную мысль... Давайте попробую обрисовать задачу по другому: 1. Есть пользователь (иллюстрирует мою программу), который работает за компьютером 2. Есть некоторая программа, скажем LibreOffice (иллюстрирует некоторую сборку-Х), которая установлена на компьютер пользователя (п.1) 3. Пользователю, вдруг пришла в голову мысль запустить LibreOffice, поработать там и закрыть его. И возможно, вообще забыть, что он когда-то был установлен или запущен. А потом запустить его ещё раз, поработать, снова закрыть и так далее. При этом, как работает LibreOffice, на чём он написан и все прочие параметры - не интересуют пользователя. Я вижу это так: 1. Запускаем один (или несколько) управляемых потоков 2. Ждём "сигнал" 3. По сигналу (п.2) убиваем потоки (п.1) и забываем, что они когда-то вообще были, до того самого момента, пока они снова нам не понадобятся.
0
|
||
|
|
|||
| 04.05.2015, 10:17 | |||
|
0
|
|||
|
|
|||
| 04.05.2015, 10:39 | |||
|
0
|
|||
|
В экстазе
|
|
| 04.05.2015, 10:47 [ТС] | |
|
insite2012, вероятно я не совсем корректно изложил условия задачи. Давайте попробую ещё раз...
Есть две ключевых сущности: 1. Метод, который работает не бог весть как (нам не известно, как он работает и что он вообще делает, в т.ч. он может работать как в примере выше). Загружается этот метод из сторонней сборки. 2. Другой метод, работающий в своём, независимом потоке, который отвечает за установку одного единственного флага или вызов другого метода, который должен убивать потоки, в которых работает метод из п.1. Если "чужой" метод может завершаться сам по себе, то нет глобального смысла управлять потоком, в котором он работает. Т.к. метод завершится, сделает return; и поток умрёт сам по себе, без моего вмешательства. Соответственно, и вопрос не имел бы особого смысла изначально, при таких условиях.
0
|
|
|
|
|||
| 04.05.2015, 10:57 | |||
|
0
|
|||
|
В экстазе
|
||
| 04.05.2015, 14:51 [ТС] | ||
|
И тут предположим возникла такая ситуация, что вместо страницы нам попался BluRay-фильм (50Гб), а скорость обмена данными с сервером - 64Кбит/сек. И вот настаёт момент, когда нам нужно прервать процесс загрузки страницы и убить поток, в котом он скачивается, например, по той причине, что если "страница" (в примере - фильм) не скачались за, скажем 5 минут - нужно ликвидировать этот процесс, со всеми потрохами. При этом, сам по себе, процесс ликвидироваться не может, т.к. его разработчик - программист не высшего "качества", он не предусмотрел "самоликцидацию" процесса, в случае, если "...". Добавлено через 3 часа 42 минуты Давайте я ещё более конкретизирую вопрос. Задача: Создать 5 потоков, в каждом из которых открывается MessageBox, подождать 10 секунд, уничтожить все эти потоки и MessageBox'ы еже с ними. Не дожидаясь, пока предыдущие 5 потоков что-то родят - создать 5 новых потоков, с другими MessageBox'aми и закрыть их через 30 секунд. Если это возможно, подскажите пожалуйста, максимально простой пример кода. Спасибо!
0
|
||
|
|
|||||||
| 04.05.2015, 15:56 | |||||||
0
|
|||||||
|
В экстазе
|
||||||
| 04.05.2015, 16:24 [ТС] | ||||||
|
Получилось не совсем то, чего я хотел.
Task.WaitAll не уничтожает потоки, она просто ждёт какое-то время, пока поток не завершится, а потом продолжает выполнения программы дальше, ничего не делая с потоком, который выполняется. Убедиться в этом легко:
Мне же нужно уничтожить не весь процесс или главное окно, а один конкретный поток, не зависимо от того, что там в нём происходит. И как следствие, уничтожить всех его потомков.
0
|
||||||
|
В экстазе
|
||||||
| 04.05.2015, 16:35 [ТС] | ||||||
Добавлено через 1 минуту *при этом MessageBox может как возвращать что-то, так может и не успеть что-то вернуть. По этому, если в течение, скажем, 10-и секунд, MessageBox ничего не вернул - нужно его уничтожить, вместе с потоком его вызвавшим.
0
|
||||||
|
Warrior
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
|
||||||
| 04.05.2015, 19:17 | ||||||
0
|
||||||
|
В экстазе
|
||||||||||||
| 06.05.2015, 11:24 [ТС] | ||||||||||||
|
Давайте попробуем так. Есть вот такой код:
Если говорить ещё точнее, мне нужно запустить 5-10 таких потоков, в каждом из которых будет выполняться DoWork со своими параметрами, подождать некоторое время, остановить выполнение всех ранее запущенных потоков, не дожидаясь пока они что-то вернут или предпримут, а потом запустить новые 5-10 штук и так далее. Если ещё точнее, то каждый поток запускается на 1 минуту, если за это время он ничего не вернул, - то должен быть безусловно уничтожен, не зависимо от его пожеланий, т.к. операция внутри потока может просто "зависнуть" на неопределённое время. Если поток возвращает какое-то значение сам, не зависая, тут проблем нет. Есть масса способов "дождаться" выполнения потока, например с помощью async/await... Но бывает такое, что поток просто "завис", и должен быть полностью аннигилирован, т.к. есть вероятность, что дождаться момента, когда он что-то вернёт - невозможно. Добавлено через 4 минуты P.S. Первый блок кода - приведён исключительно для примера. Я не знаю, что будет в реальном коде, т.к. "реальный" код загружается из внешней сборки, и какая именно там логика зашита - я не знаю. Но, какая бы там не была логика - у неё есть строгий лимит на выполнение операции, и если код не успел завершиться за это время - значит, он должен быть выгружен/остановлен/уничтожен/аннигилирован. Добавлено через 4 минуты Другой вариант развития событий - потоки должны выполняться неопределённое время, то есть до наступления какого-то события. Как только наступило событие Х, мы должны прервать все ранее выполняющиеся потоки (полностью уничтожить их, в т.ч. и остановить выполняющийся в них код) и запустить новую партию потоков.
0
|
||||||||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 06.05.2015, 12:54 | ||
|
0
|
||
|
В экстазе
|
|
| 06.05.2015, 20:31 [ТС] | |
|
kolorotur, в таком решении, для меня есть несколько моментов, которые мне не ясны:
1. Можно ли запустить .dll (сбоку) в отдельном процессе? 2. В случае, если от "процесса" нужно будет получать некоторые данные, или передавать в него, какие-то параметры - как это сделать, теоретически? Дело в том, что в данный момент, необходимый код, предоставляется исключительно в виде .dll (сборок) и доступен только удалённо (по сети). P.S. Возможно, всё-таки существует некоторый способ именно "уничтожения" потоков? Мне всегда казалось, что парадигма C# предусматривает нечто подобное... Уничтожил поток, а сборщик мусора приберётся и добьёт, эм... недобитые данные.
0
|
|
| 06.05.2015, 20:31 | |
|
Помогаю со студенческими работами здесь
20
Скачать файл в несколько потоков Создать и запустить одновременно несколько потоков BackgroundWorker, несколько потоков и процент выполнения
Сортировка массива используя несколько потоков Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|