protected void TaskEndHandler(object worker, EventArgs args)
{
TaskWorker new_worker = null;
EventHandler eh = null;
lock( _sync ) {
TaskWorker this_worker = (TaskWorker)worker;
object task = this_worker.Task;
Queue work_queue = (Queue)_task_to_workers[task];
if( work_queue != null ) {
work_queue.Dequeue();
if( work_queue.Count > 0 ) {
//Now the new job is at the head of the queue:
new_worker = (TaskWorker)work_queue.Peek();
}
else {
/*
* There are no more elements in the queue, forget it:
* If we leave a 0 length queue, this would be a memory
* leak
*/
_task_to_workers.Remove(task);
}
_worker_count--;
if (_worker_count == 0) {
eh = EmptyEvent;
}
}
else {
//This TaskEndHandler has been called more than once clearly.
Console.Error.WriteLine("ERROR: {0} called TaskEndHandler but no queue for this task: {1}",
worker, task);
}
}
if( new_worker != null && (1 == _is_active)) {
//You start me up!
Start(new_worker);
}
if( eh != null ) { eh(this, EventArgs.Empty); }
}
}