void DoFor(int iterations, ParallelAction action, Task task) { if (!m_Initialized) Initialize(); // No multithreaded support if (!m_Initialized) { for (var i = 0; i < iterations; ++i) action(i); return; } if (iterations == 0) return; var chunkSize = Mathf.Clamp(iterations/m_ThreadCount, 1, iterations); task.ResetTask(iterations, chunkSize, action); var id = 0; for (var i = 0; i < iterations; i += chunkSize) { var startIndex = id*chunkSize; var endIndex = Math.Min(startIndex + chunkSize, iterations); m_ActionQueue.Enqueue(() => DoTaskAction(task, startIndex, endIndex)); m_QueueIsNotEmptyEvent.Set(); ++id; } task.Wait(); }