public void ScheduleTask <T>(T task, Action <T, int> scheduled)
        {
            var index = FindLeastLoaded();
            var leastLoadedWorkerState = _workerState[index];
            var taskState = new TaskState(worker => scheduled(task, worker));

            _tasks.Add(task, taskState);
            if (_workLoadEstimationStrategy.MayScheduleOn(leastLoadedWorkerState))
            {
                ScheduleOn(index, taskState);
            }
            else
            {
                _pendingTasks.Enqueue(taskState);
            }
        }
 private void Schedule()
 {
     while (_pendingTasks.Count > 0)
     {
         var leastLoadedWorker = FindLeastLoaded();
         if (_workLoadEstimationStrategy.MayScheduleOn(_workerState[leastLoadedWorker]))
         {
             var task = _pendingTasks.Dequeue();
             ScheduleOn(leastLoadedWorker, task);
         }
         else
         {
             break;
         }
     }
 }