public List <Move> GetNextMoves(IEnumerable <Move> previousMoves) { var tasks = new List <Task <string> >(); var nextMoves = new List <Move>(); try { var roleTaskIds = new Dictionary <string, int?>(); foreach (var _player in Players) { var player = _player; Task <string> newTask; if (previousMoves.Any()) { var previousMovesAsString = String.Empty.JoinAdvanced("(", ") ", previousMoves.Select(n => n.TheMove).ToArray()); newTask = new Task <string>(() => player.PlayAsync(MatchId, "(" + previousMovesAsString + ")")); } else { newTask = new Task <string>(() => player.PlayAsync(MatchId, PlayerManagerProtocolConstants.NilReplyString)); } roleTaskIds.Add(player.Role, newTask.Id); tasks.Add(newTask); newTask.Start(); } Task.WaitAll(tasks.ToArray()); foreach (string _role in TheGeneralGame.FindRoles()) { var role = _role; var task = tasks.Where(n => n.Id == roleTaskIds[role]).First(); nextMoves.Add(new Move(role, task.Result)); } return(nextMoves); } catch (AggregateException ex) { ex.Handle(_ => false); } catch (Exception) { throw; } return(nextMoves); }
public void StartAllPlayers() { var tasks = new List <Task <string> >(); try { var roles = TheGeneralGame.FindRoles().ToArray(); int roleCount = 0; foreach (var _player in Players) { var player = _player; string tmpRoleString = roles[roleCount++].ToString(); #if DO_SERIAL var foo = player.StartAsync(MatchId, tmpRoleString, TheGeneralGame.Description, StartClock, PlayClock); #else var newTask = new Task <string>(() => player.StartAsync(MatchId, tmpRoleString, TheGeneralGame.Description, StartClock, PlayClock)); tasks.Add(newTask); newTask.Start(); #endif } //Task.WaitAll(tasks.ToArray(), StartClock*1000); Task.WaitAll(tasks.ToArray()); } catch (AggregateException ex) { ex.Handle(_ => false); } catch (Exception) { throw; } }