Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173

Как остановить ThreadPool нажатием кнопки?

28.05.2014, 00:16. Показов 2196. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Использую Threadpool, обернутый в backgroundWorker1 (чтобы не тормозил интерфейс):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//запуск backgroundWorker
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    DateTime start = DateTime.Now;
 
    string[] files = Directory.GetFiles("C://Files", "*.txt");
 
    RunningWorkers = files.Length;
    foreach (string file in files)
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(CheckFile), (object)file);
        Thread.Sleep(10);
    }
 
    //ожидание threadpool
    lock (workerLocker)
    {
        while (RunningWorkers > 0)
            Monitor.Wait(workerLocker);
    }
}
 
//функция проверки файла
private void CheckFile(object file)
{
    //некая работа
    ...
    //некая работа
 
    //для ожидания всех тредов
    lock (workerLocker)
    {
        RunningWorkers--;
        Monitor.Pulse(workerLocker);
    }
}
Мне нужно сделать так, чтобы при нажатии кнопки на интерфейсе ThreadPool останавливал работу. Если невозможно его остановить, то хотя бы, чтобы он не начинал обрабатывать следующий файл из массива.

Подскажите, как это лучше сделать?
(Task не предлагать, сам знаю, что там можно)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.05.2014, 00:16
Ответы с готовыми решениями:

Есть ли возможность остановить работу threadPool?
Подскажите, есть ли возможность остановить работу threadPool? Почему-то при создании обычных Thread с lock работа становится в разы...

Как изменить фон окна (WPF) нажатием кнопки на картинку?
Как изменить фон окна (WPF) нажатием кнопки на картинку?

[WPF] Как остановить рекурсию на нажатие кнопки?
Сканирую файлы в директории, как остановить работу программы? Спасибо. using System.IO; using System.Windows; namespace...

4
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
28.05.2014, 03:11
CancellationTokenSource class, CancellationToken structure.
0
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
28.05.2014, 07:15  [ТС]
IamRain, этот класс введен в c# 4.0, т.е. он только для Task-ов поддерживается, а нужно для Threadpool.

Добавлено через 18 минут
Короче, просто добавил:

C#
1
2
3
4
5
            if (stop)
            {
                stop = false;
                return;
            }
в метод CheckFile.
0
 Аватар для Spawn
995 / 893 / 354
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
28.05.2014, 07:17
Цитата Сообщение от Suppir Посмотреть сообщение
этот класс введен в c# 4.0, т.е. он только для Task-ов поддерживается, а нужно для Threadpool.
Да Вам так или иначе аналогию делать в конечном счёте придётся...
bool это круто, конечно, но не напасёшься на все случаи жизни
0
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
28.05.2014, 11:48  [ТС]
Черт побери, не работает этот bool

Видимо, потому что происходит ожидание всех тредов:
C#
1
2
3
4
5
6
//ожидание threadpool
    lock (workerLocker)
    {
        while (RunningWorkers > 0)
            Monitor.Wait(workerLocker);
    }
Может, кто знает, как исправить?

Добавлено через 7 минут
Нет, похоже, что вот эта остановка:

C#
1
2
3
4
5
 if (stop)
            {
                stop = false;
                return;
            }
не работает из-за того, что я указываю внутри нее: stop = false;
То есть один тред остановился, но при этом выключил флаг остановки - и на остальные треды этот флаг не действует. А нужно флаг снимать, когда все треды завершат работу.

Добавлено через 3 минуты
Похоже, с этим тоже разобрался...

Добавлено через 4 часа 7 минут
Еще такой вопрос возник.

Я хочу задать максимальное количество потоков, равно 2. Пишу:

C#
1
2
3
4
5
6
7
           ThreadPool.SetMaxThreads(2, 2);
 
            foreach (string file in files)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(CheckFile), (object)file);
                Thread.Sleep(10);
            }
Но программа все равно используют 4 и более потоков! Даже если выставляю ThreadPool.SetMaxThreads(1, 1), то эти опции явно не работают. В чем может быть дело?

Добавлено через 2 минуты
Блин, все понял:

You cannot set the number of worker threads or the number of I/O completion threads to a number smaller than the number of processors in the computer.

Короче, на тредпуле всегда будет количество потоков - не меньше, чем логических ядер в процессоре.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.05.2014, 11:48
Помогаю со студенческими работами здесь

Как на макете Canvas нажатием кнопки менять позицию (координаты) объекта?
Задача конкретная: именно в коде и именно кнопкой нужно менять координаты объекта (например, объекта Image) Canvas.Left и CanvasTop, не...

Как изменить код нажатием кнопки?
Как изменить адрес при нажатии кнопки "C:\Users\Michael\Desktop\1\System\Sounds\FIP.mp3" <MediaElement Height="106"...

Как остановить поток из другой кнопки?
private void buttonpause_Click(object sender, EventArgs e) { mainLabel.Text = "Работа алгоритма приостановлена....

Нужно изменить доступность кнопки в одной форме нажатием кнопки в другой
Есть две формы. В первой есть кнопка "which" с enabled = false, во второй есть кнопка, нажатие которой должно делать which активной. Как...

Как вводить числа в массив и заканчивать ввод нажатием кнопки Enter!
Всем привет, у меня такой вопрос! Как вводить числа в массив от 0 до 12 например и заканчивать ввод нажатием кнопки Enter! Заранее все...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru