public ParallelProcessingLoadBalancer(
            int workers, long maxScheduledSizePerWorker, int maxUnmeasuredTasksPerWorker)
        {
            if (workers <= 0)
            {
                throw new ArgumentException("At least one worker required", "workers");
            }
            if (maxScheduledSizePerWorker <= 0)
            {
                throw new ArgumentException("maxScheduledSizePerWorker <= 0");
            }
            if (maxUnmeasuredTasksPerWorker <= 0)
            {
                throw new ArgumentException("maxUnmeasuredTasksPerWorker <= 0");
            }

            _workLoadEstimationStrategy = new WorkLoadEstimationStrategy(
                maxScheduledSizePerWorker, maxUnmeasuredTasksPerWorker);
            _workerState = new WorkerState[workers];
            for (int index = 0; index < _workerState.Length; index++)
            {
                _workerState[index] = new WorkerState(index);
            }
        }