Как добавить потоки в задачи Task?

У меня есть Task.Run(() => тут метод)
Как можно сделать чтобы метод выполнялся с нужным кол-во потоков ?
Или же тогда получается что задачи не нужны и оставить только Threads ?


Ответы (3 шт):

Автор решения: tym32167

Чтобы что то запускать с нужным количеством потоков - самый простой способ, это использовать TPL

Parallel.For(0, 10, new ParallelOptions() {MaxDegreeOfParallelism = 10 /* Нужное количесво потоков */}, (i) => {/* ваш метод */});
→ Ссылка
Автор решения: Иван Рудаков
    public class Program
    {
        public static void Main()
        {
            
        Parallel.For(0, 3, new ParallelOptions() {MaxDegreeOfParallelism = 10}, (i) => {Run("хмм");}); //Взято из предыдущего комментария
            
        ParallelLoopResult result = Parallel.ForEach<int>(new List<int>() { 1, 3, 5, 8 }, Parallels); // Перебирает коллекцию в многопотоке

        Task[] tasks = new Task[3]; // Создаем массив задач
        for (int i = 0; i < tasks.Length; i++) //Перебираем задачи
        tasks[i] = Task.Factory.StartNew(() => Run("эмм")); //запускаем
        }

        static void Parallels(int n)
       {
        Console.WriteLine(n);
       }
        static void Run(string res)
        {
            Console.WriteLine(res);
        }

Вывод: хмм хмм хмм 1 5 3 8 эмм эмм эмм

→ Ссылка
Автор решения: Иван Рудаков

Более интересная реализация

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace TaskRun
{
    internal class JobManager : IDisposable
    {
        private SemaphoreSlim _semaphore;
        private CancellationTokenSource _cancelToken;

        public CancellationTokenSource CancellationTokenSource
        {
            get => _cancelToken ?? new CancellationTokenSource();
        }

        public async Task JobStart(List<string> list, Func<string, Task> action, int thread)
        {
            _semaphore = new SemaphoreSlim(thread);
            _cancelToken = new CancellationTokenSource();

            var pool = new List<Task>(thread);

            foreach (var item in list)
            {
                await _semaphore.WaitAsync().ConfigureAwait(false);

                pool.Add(Task.Run(() =>
                {
                    action(item);
                    _semaphore.Release();
                }, _cancelToken.Token));
            }

            await Task.WhenAll(pool.ToArray()).ConfigureAwait(false);
        }

        public void JobStop()
        {
            _cancelToken.Cancel();
        }

        public void Dispose()
        {
            _semaphore?.Dispose();
            _cancelToken?.Dispose();
        }
    }
}

Запуск в многопотоке

 JobManager _manager = new JobManager();
       var Data = new List<string>(){"Один", "Два"};
       await _manager.JobStart(Data, Work, 10); 
//10 число потоков, Work наш метод, Data - Передаем список в метод для обработки
        async Task Work(string iteam)
        {
         Console.Writeline(iteam);
        }
→ Ссылка