// ReSharper restore FunctionNeverReturns private void FindWork(out Task task) { bool foundWork = false; task = default(Task); do { // Priority #1: Check local task queue. if (_tasks.LocalPop(ref task)) { break; } // Priority #2: Check global task queue. if (_scheduler.TryGetTask(ref task)) { break; } // Priority #3: Check replicables. if (WorkItem.TryGetReplicable(ref task)) { task.DoWork(); WorkItem.RemoveReplicable(task); task = default(Task); continue; } // Priority #4: Check local task queues of other threads. int numberOfWorkers = _scheduler.Workers.Count; for (int i = 0; i < numberOfWorkers; i++) { var worker = _scheduler.Workers[i]; if (worker == this) { continue; } if (worker._tasks.TrySteal(ref task, 0)) { foundWork = true; break; } } if (!foundWork) { // Wait until a new task gets scheduled. Gate.WaitOne(); } } while (!foundWork); }
// ReSharper disable FunctionNeverReturns private void WorkLoop() { while (true) { _resetEvent.WaitOne(); _work.DoWork(); lock (IdleWorkers) { IdleWorkers.Push(this); } } }