Beispiel #1
0
        // 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);
                }
            }
        }