Exemplo n.º 1
0
 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;
             }
         }
     }
 }
Exemplo n.º 2
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();
            });
        }