Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 75

Task, как узнать, задействованы ли все потоки?

27.01.2018, 22:24. Показов 2940. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Насколько я понял Task использует максимально эффективно все ресурсы компьютера (т. е. создает пул потоков с количеством ядер процессора). Мне нужно запустить задачи в пуле потоков, но если пул потоков задействован на 100%, не ставить задачу в очередь, а просто узнать об этом. Возможно ли такое с использованием Task.Run?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.01.2018, 22:24
Ответы с готовыми решениями:

Убить все потоки с помощью отдельной задачи (Task)
Подскажите запускаю я в отдельном потоке Tasks = new Task(() => { while(true) ...

Как узнать статус Task-a из другого метода
хочу сделать что то типа такого , но условия видимости не позволяют private void button1_Click(object sender, EventArgs e) ...

Потоки, мультипоточность Task or Async/Await or ThreadPool?
Здравствуйте форумчане. Я очень нуждаюсь в вашей помощи. Я реализовываю парсер с одного довольно популярного сайта занятости и...

8
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
27.01.2018, 22:31
https://msdn.microsoft.com/ru-... .110).aspx
1
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
28.01.2018, 01:52
rugga,

Не по теме:

"не правильно, ты, дядя Федор, презерватив одеваешь, надо пупырышками внутрь, что б себе приятней было"


не правильно понял(а понял ли вообще?) таск это некая задача, которую ты наказываешь решить, а кто-где-когда-и вообще нафига - решает среда исполнения(в софтине, тасков может быть море разливанное, но они все могут выполняться в паре потоков[thread], или даже в одном)
потоками рулит ОС, сколько дали, тем и обходись, и тут уже, среда выполнения все за тебя и порешает и распределит и выполнит...
0
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 75
28.01.2018, 21:32  [ТС]
Суть от этого не меняется. Вопрос не в том, что такое Task, и где оно исполняется.

Объясню на примере:
Запускаем 100500 тасков, ясное дело все 100500 сразу же не будут исполняться, т. к. ресурсов компьютера не хватит, и большинство добавится в очередь (по умолчанию).

И вот вопрос в том, как сделать, чтобы в очередь не добавлялся Task, если прямо сейчас он не может запуститься (или в течении 1 сек)?

Что-то типа такого:
C#
1
2
3
 if(!isBusyAll) {
   Task.Run(() => {});
}
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
28.01.2018, 21:43
rugga,
Если бы вы внимательно прочитали указанную LeniumSoft ссылку, то узнали бы, что все уже и так сделано за вас:
Если нет доступных потоков, запросы к пулу потоков дополнительных остаются в очереди, пока не станут доступными пула потоков.
Добавлено через 2 минуты
Цитата Сообщение от rugga Посмотреть сообщение
чтобы в очередь не добавлялся Task,
просто тогда используйте Thread.GetAvailableThreads, как уже сказали. Зачем такой функционал вообще понадобился?
1
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 75
28.01.2018, 21:59  [ТС]
просто тогда используйте Thread.GetAvailableThreads, как уже сказали.
Спасибо, т. е. так?

Code
1
2
3
4
5
6
7
int worker = 0;
int io = 0;
ThreadPool.GetAvailableThreads(out worker, out io);
 
if(woker > 0) {
   Task.Run(() => {});
}
Зачем такой функционал вообще понадобился?
Тут в задаче написано так сделать. Типа из сети приходят задачи, если загружен, то не нужно выполнять. Чтобы пользователь не ждал, а просто получил ответ, типа пока занят.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
28.01.2018, 22:26
Цитата Сообщение от rugga Посмотреть сообщение
Спасибо, т. е. так?
Да, именно так.
0
0 / 0 / 0
Регистрация: 10.02.2014
Сообщений: 75
28.01.2018, 23:17  [ТС]
Нет, это не работает. Первые 4 задачи сразу запускаются, остальные добавляются в очередь. GetAvailableThreads worker больше 1000. Что не так?

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
        static void Main(string[] args)
        {
            int id = Thread.CurrentThread.ManagedThreadId, worker = 0, io = 0;
 
            for(var i = 0; i < 1500; i++)
            {
                int j = i, w = 0;
                ThreadPool.GetAvailableThreads(out w, out io);
                if(w > 0) { Task.Run(() => MakeWork(j)); }
            }
 
            Thread.Sleep(250);
            ThreadPool.GetAvailableThreads(out worker, out io);
            Console.WriteLine("Ava: " + worker + ", ConId: " + id);
            Console.ReadLine();
        }
 
        static void MakeWork(int number)
        {
            double a = 1;
            int worker = 0;
            int io = 0;
            ThreadPool.GetAvailableThreads(out worker, out io);
 
            int id = Thread.CurrentThread.ManagedThreadId;
            Console.WriteLine("Num: " + number + ", Id: " + id + ", Ava: " + worker);
 
            for (int i = 0; i < 10000; i++)
                for (int j = 0; j < 50000; j++)
                    a /= 1.01;
        }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.01.2018, 08:34
Цитата Сообщение от rugga Посмотреть сообщение
Что не так?
Наверное, количество процессоров/ядер у вас меньше тысячи.

Если количество потоков превышает количество ядер/процессоров, то производительность в какой-то момент начинает падать из-за постоянного переключения контекста.
Ну и Task.Run старается не использовать потоков больше, чем ядер.

Попробуйте запускать так:
C#
1
if (w > 0) { Task.Factory.StartNew(() => MakeWork(j), TaskCreationOptions.LongRunning); }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.01.2018, 08:34
Помогаю со студенческими работами здесь

Узнать о завершении работы Task
Добрый день, запускаю задачи вот таким вот образом private void Start_Click(object sender, RoutedEventArgs e) { ...

Как прервать все потоки?
Пожалуйста помогите разобраться с потоками :). Существует несколько потоков, которым присвоены имена (точнее номера Thread.Name = num),...

Как остановить все потоки разом?
вот код программы после запуска с помощью левой кнопки мыши я создаю потоки(шарики) и с помощью правой кнопки мыши надо остановить все...

Многопоточность. Как остановить все потоки разом?
Сделал как тут: http://avtuh.ru/2010/10/10/delphi-videourok-mnogopotochnost-i-sinxronizaciya.html Как можно остановить разом все потоки?

Как по нажатию кнопки остановить все потоки?
Есть программа которая считает файлы в указанной директории public class CountFilesTest { public static void main(String args)...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru