private void CreateAITask(uint aiID, uint targetID, float deltaTime, int iterations) { mAIIterator.Add(aiID); var resultPlacement = new BlockingCollection <VehicleControls>(1); mControlResults[aiID] = resultPlacement; var requestPlacement = new BlockingCollection <SimulationState>(1); mControlRequests[aiID] = requestPlacement; MonteCarloVehicleAI ai = new MonteCarloVehicleAI(aiID, targetID, deltaTime, SimulationData, iterations); //TODO: inconsistently assuming delta time fixed here and otherwise elsewhere Action aiAction = () => { while (true) { SimulationState state = requestPlacement.Take(); VehicleControls controls = ai.ComputeControl(state); resultPlacement.Add(controls); } }; Task aiTask = new Task(aiAction); requestPlacement.Add(ActiveState); aiTask.Start(); }