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();
        }
示例#4
0
        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);
            }
        }
示例#6
0
        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);
                    }
                }
            });
        }