private Task StartWorker(Func <int, Task> work) { int workerId = idleWorkers.Min(); idleWorkers = idleWorkers.Remove(workerId); Task doingWork = Task.Run ( async() => { try { await work(workerId); } finally { CompleteWork(workerId); } } ); busyWorkers = busyWorkers.Add(workerId); return(Task.FromResult(doingWork)); }