Как добавить потоки в задачи 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);
}