Как работает пул потоков?

72
18 января 2022, 15:20

В .NET есть пул потоков, - это заготовленные потоки, готовые к выполнению какой-то задачи.

Но при ручном создании потока нету возможности создать поток без вызова (т.е. на будущее) делегата и более того, если поток отработал, то ему нельзя дать другую задачу.

Так как эта магия происходит?

Даже в WinApi, вроде, нету функции, которой можно было бы передать уже созданному потоку некоторое задание...

Answer 1

Пул потоков – это коллекция потоков для выполнения методов в фоновом режиме. Распределение пулов занимается CLR. Что бы выполнить метод асинхронно необходимо поместить его в очередь потока, пул потоков будет сам извлекать методы из очереди и выполнять их. При наличии большого количества методов, будет создан еще один фоновый поток. Когда поток отработает, он не уничтожается, а возвращается в пул поток для ожидания следующей задачи.

ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomething));

Для более гибкой работы с потоками есть Task(Задача), которая может использовать так называемое продолжение (ContinueWith)

Task task = new Task(new Action(Method1));
Task continue = task.ContinueWith(new Action<Task>(Method2));

Так же у задачи есть возможность «подготовки» к выполнению + отложенный стар.

Task task = new Task(new Action(DoSomething), TaskCreationOptions.PreferFairness |
                                                          TaskCreationOptions.LongRunning);

«Холодный» запуск задачи

Task task = new Task(new Action(Method1));
//что-то делаем
Task.Start();

«Горячий» запуск задачи

Task.Run(new Action(Method));

Выполнение в основном потоке

Task task = new Task(new Action(Method));
Tast.RunSynchronously();

ну и нововведение ValueTask - обертка над самой задачей

System.Treading.Tasks.Extensions

Как – то так вот…

READ ALSO
Графическа библиотека на С#?

Графическа библиотека на С#?

Вот на хабре наткнулся на C# код, но ни как не пойму что это за библиотека (если это вообще библиотека)В общем, подскажите пожалуйста как мне...

241
Прибавить 10 дней к дате

Прибавить 10 дней к дате

Допустим, есть такая дата: 2412

58
вывести два json массива в одном ajax

вывести два json массива в одном ajax

есть два разные массива по значениям и количеству содержания

160
переход с php 5.3 на php 7.4 preg_replace

переход с php 5.3 на php 7.4 preg_replace

Вообщем перестал грабить с обновлением php до последней версии старый код работал

85