/* * Сформировать новую задачу. */ public SubTask getTask(long id) { lock (executionLock) { if (completed) { return(null); // Нет смысла формировать задачи } if (processedTasks.ContainsKey(id)) // Возвращаем задачу клиенту, если он забыл о ней { return(processedTasks[id]); } //------------------------------------- БЛОК, КОТОРЫЙ ВЫ ДОЛЖНЫ ПОМЕНЯТЬ! // Описана сама логика формирования нового задания // Рассматриваю свой случай if (sequences != null && sequences.Count() >= 2) // Если в куче сырья только один элемент, { // то сортировка закончена List <int> seq1; List <int> seq2; seq1 = sequences.First(); // достали один элемент sequences.RemoveAt(0); seq2 = sequences.First(); // достали второй элемент sequences.RemoveAt(0); SubTask task = new SubTask(seq1, seq2); // создали новое задание processedTasks.Add(id, task); // сохранили его в базе lastTaskCreation = DateTime.Now; // засекли время создания return(task); // вернули новую задачу клиенту. } //------------------------------------------- return(null); } }
// Сдать задачу public void complete(long id, SubTask task) { lock (executionLock) { if (processedTasks.ContainsKey(id)) // Все задания записаны в базе { // Нет в базе - сбой if (task.haveResult()) // Задание выполнено? { //---------------------------------------------------------------- ЗАМЕНИТЬ sequences.Add(task.getResult()); // Возвращаем результат в сырье processedTasks.Remove(id); // Удаляем задачу из реестра if (sequences.Count == 1 && processedTasks.Count == 0) // Проверяем на окончание вычислений { completed = true; } //---------------------------------------------------------------- } } } }
public void start() { try { channel = new TcpChannel(); ChannelServices.RegisterChannel(channel, false); Console.WriteLine("Введите адрес сервера (tcp://localhost:8080/RemoteTask)"); string addr = Console.ReadLine(); server = (RemoteTask)Activator.GetObject(typeof(RemoteTask), addr); id = server.joinToServer(); while (true) { myTask = server.getTask(id); if (myTask != null) { myTask.execute(); server.complete(id, myTask); taskCount++; Console.Clear(); Console.WriteLine("Выполнено задач: " + taskCount); } else { Thread.Sleep(1000); Console.Clear(); Console.WriteLine("Ожидаю задачу..."); } } } catch (SystemException) { Console.WriteLine("Соединение было потеряно, завершение работы.\n" + "Нажмите для продолжения..."); } }
/* * Сформировать новую задачу. */ public SubTask getTask(long id) { lock (executionLock) { if (completed) return null; // Нет смысла формировать задачи if (processedTasks.ContainsKey(id)) // Возвращаем задачу клиенту, если он забыл о ней { return processedTasks[id]; } //------------------------------------- БЛОК, КОТОРЫЙ ВЫ ДОЛЖНЫ ПОМЕНЯТЬ! // Описана сама логика формирования нового задания // Рассматриваю свой случай if (sequences != null && sequences.Count() >= 2) // Если в куче сырья только один элемент, { // то сортировка закончена List<int> seq1; List<int> seq2; seq1 = sequences.First(); // достали один элемент sequences.RemoveAt(0); seq2 = sequences.First(); // достали второй элемент sequences.RemoveAt(0); SubTask task = new SubTask(seq1, seq2); // создали новое задание processedTasks.Add(id, task); // сохранили его в базе lastTaskCreation = DateTime.Now; // засекли время создания return task; // вернули новую задачу клиенту. } //------------------------------------------- return null; } }