C#: создание и остановка потоков из listview
Доброго времени суток господа, нужна ваша помощь, с потоками я полный 0 да и нужно всего-лишь создать определенный поток и его завершить по команде, НО я не создаю каждый поток заранее, так как их будет очень много, делаю это вот так:
Thread thread = new Thread(() => Go(..... много много переменных которые берутся из listview ......)); thread.Start();
Так вот, как подмечено выше, переменные беруться из листвью, который в свою очередь подгружается мною из файла и далее я запускаю нужные мне потоки. НО процесс в потоке бесконечный и завершиться только если я полностью закрою программу, а хотелось бы завершать поток так же, как я его и запускал (правый клик на нужную строку - запустить/остановить). Как я и говорил, с потоками я никогда не работал и думал, что это как-то все просто, типа при старте потока назначаешь ему айди и по тому же айди и завершаешь, но увы. Я облазил весь гугл и так и не нашел подходящего мне ПРИМЕРА (третий раз повторюсь - с потоками я никогда не работал и не надо мне говорить "иди читай про TPL"), так что прошу помощи, желательно на примере)
У меня есть очень плохая идея: в листе невидимая колонка в которой при старте генерируется айди, дальше когда я посылаю команду запуска потока - создается уникальная переменная с названием например int id1=0 и ее название передается собственно самому потоку и при каждом старте цикла в нем проверяется id1=0 или 1, соответственно если 0 - продолжаем, если 1 - пустота. Ну и логично, что при нажатии кнопки остановить ее значение меняется на 1. Но что-то мне кажется, что меня за такое покарает святой дух многопоточности когда потоков станет 100+. Идею я эту где-то прочитал, так что не ругайтесь)
Ответы (1 шт):
Мне кажется, лучше не надо запускать потоки из элементов интерфейса. Лучше запустите сразу в программе отдельным потоком обработчик некоей очереди, пусть она будет сначала пустая. А из интерфейса добавляйте в эту очередь команду - мол, надо обработать такую-то штуку. Поток обработки очереди увидит в очереди эту команду, сам согласно параметрам обратиться к нужным элементам интерфейса, заберёт данные, если нужно - стартует отдельный поток обработки именно этих данных. Остановку делать таким же образом - добавлять команду остановки в очередь. Примерно так. Интерфейс должен всё по возможности отрабатывать быстро и не вешать на себя дополнительных потоков. Потоки пускай основной процесс плодит по мере надобности, а не интерфейс. Интерфейс должен быть лёгким и отзывчивым, тяжёлую бизнес-логику он не должен ворочать сам ни коим образом, даже с помощью дополнительных потоков.