В .NET есть пул потоков, - это заготовленные потоки, готовые к выполнению какой-то задачи.
Но при ручном создании потока нету возможности создать поток без вызова (т.е. на будущее) делегата и более того, если поток отработал, то ему нельзя дать другую задачу.
Так как эта магия происходит?
Даже в WinApi, вроде, нету функции, которой можно было бы передать уже созданному потоку некоторое задание...
Пул потоков – это коллекция потоков для выполнения методов в фоновом режиме. Распределение пулов занимается 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
Как – то так вот…
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Вот на хабре наткнулся на C# код, но ни как не пойму что это за библиотека (если это вообще библиотека)В общем, подскажите пожалуйста как мне...
есть два разные массива по значениям и количеству содержания
Вообщем перестал грабить с обновлением php до последней версии старый код работал