private void UpdateTaskAssignments() { lock (Host) { for (int i = 0; i < PendingTasks.Count; i++) { if (AvailableClients.Count > 0) { var task = PendingTasks[0]; IRemoteXTMF previousHost = null; if (PreferPreviousClient && PreviousTaskAssignments.TryGetValue(task.TaskName, out previousHost) && AvailableClients.Contains(previousHost)) { RemoveClient(previousHost); task.Client = previousHost; } else { task.Client = AvailableClients.Pop(); } task.TaskNumber = GetTaskNumber(); PreviousTaskAssignments[task.TaskName] = task.Client; ExecutingTasks.Add(task); // clean up PendingTasks.RemoveAt(0); // fire the message to start processing task.Client.SendCustomMessage(task, DistributionDataChannel); } else { return; } } } }
private void OnRemoveClientExecute() { var clientToRemove = SelectedAddedClient; Meeting.Model.Clients.Remove(clientToRemove); AddedClients.Remove(clientToRemove); AvailableClients.Add(clientToRemove); HasChanges = _meetingRepository.HasChanges(); ((DelegateCommand)SaveCommand).RaiseCanExecuteChanged(); }
private void OnAddClientExecute() { var clientToAdd = SelectedAvailableClient; Workout.Model.Clients.Add(clientToAdd); AddedClients.Add(clientToAdd); AvailableClients.Remove(clientToAdd); HasChanges = _workoutRepository.HasChanges(); ((DelegateCommand)SaveCommand).RaiseCanExecuteChanged(); }
private void SetupNetworkInterface() { Host.ClientDisconnected += Host_ClientDisconnected; Host.NewClientConnected += Host_NewClientConnected; Host.RegisterCustomReceiver(DistributionDataChannel, (stream, client) => { BinaryReader reader = new BinaryReader(stream); lock (Host) { switch ((CommunicationProtocol)reader.ReadInt32()) { case CommunicationProtocol.ClientActivated: AvailableClients.Push(client); break; case CommunicationProtocol.TaskComplete: { AvailableClients.Push(client); var taskNumber = reader.ReadUInt64(); ExecutingTasks.RemoveAll((task) => task.TaskNumber == taskNumber && task.Client == client); } break; case CommunicationProtocol.TaskFailed: { Console.WriteLine("Client Error:\r\n" + reader.ReadString()); client.SendCancel("Previous Task Failed"); } break; case CommunicationProtocol.SendTextMessageToHost: Console.WriteLine(reader.ReadString()); break; } } UpdateTaskAssignments(); // we don't actually bother storing an object return(null); }); Host.RegisterCustomSender(DistributionDataChannel, (task, client, stream) => { BinaryWriter writer = new BinaryWriter(stream); var t = task as ExecutingTask; if (t == null) { throw new XTMFRuntimeException(this, $"In {Name} we were sent an object for task processing that was not a task!"); } writer.Write((Int32)CommunicationProtocol.RunTask); writer.Write(t.TaskNumber); writer.Write(t.TaskName); writer.Flush(); }); }
private void SetupPicklist() { var meetingClientIds = Meeting.Model.Clients.Select(c => c.Id).ToList(); var addedClients = _allClients.Where(c => meetingClientIds.Contains(c.Id)).OrderBy(c => c.FirstName); var availibleClients = _allClients.Except(AddedClients).OrderBy(c => c.FirstName); AddedClients.Clear(); AvailableClients.Clear(); foreach (var addedClient in addedClients) { AddedClients.Add(addedClient); } foreach (var availibleClient in availibleClients) { AvailableClients.Add(availibleClient); } }
private static async void StartAssignerAsync() { await Task.Run(() => { while (true) { if (AvailableGuilds.TryDequeue(out GuildInfo guild)) { BroadcastClient client; while (!AvailableClients.TryDequeue(out client)) { Thread.Sleep(100); } client.BroadcastToAsync(guild); } else { Thread.Sleep(100); } } }); }