use my current implementation?
This is how it looks like (i removed some complexity):
// defined before:
void ProcessItem(T item);
ConcurrentQueue<T> queue;
List<Task> tasks = new[];
while (true)
{
tasks.RemoveAll(task => task.IsCompleted);
if (tasks.Count >= 5)
continue;
if (queue.TryDequeue(out T item)
tasks.Add(Task.Run(() => ProcessItem(item)));
}
But I felt like it can be improved, especially since currently I run max 5 threads, but it might could use more or less, which I do not know.
Стикер
Ok you meant use Channels?
the reader logic would still look like this tho right? since I need to create multiple tasks to read
a channel would already implement the collection anyway what to do depends on how much producers, items, ProcessItem (the consumers), and various threads are independent from each other
I mean I just wanna process the items in parallel, I dont care about how many threads it uses / tasks it creates as long as it gets done faster than what it is right now. but with channels I still have to manually create the tasks which kind of not solves my problem. I also thought about using Parallel.ForEach
channel solves the multithreading issue and the managing tasks issue, since you can tell it to have a fixed amount of contemporaneous readers then you know it depends again on a bunch of stuff, what is this processing, how long it takes (100 ms? 1 hour?), or in other words the implementation depends on all the rest of the code
Обсуждают сегодня