/// <summary> /// Послать Запрос Программно /// Необходимо занести значения в параметры /// -> они заносятся в таблицу /// -> таблица сереализуется в XML (было) /// </summary> /// <param name="targetWriter"></param> /// <param name="inNetCommandForTask"></param> private void SendRequestProgrammed(Target targetWriter, NetCommandForTask inNetCommandForTask) { string procedureName = inNetCommandForTask.ProcedureName; var querytask = mTasksSendManager.Tasks.Where((task) => task.Value.ProcedureName == procedureName).First().Value; if (querytask == null) { throw new ArgumentNullException($"<{procedureName}> отсутствует в колекции <mTasksSendManager.Tasks> в процедуре <{nameof(SendRequestProgrammed)}>"); } ManagerTaskApplication.TaskApplication taskSend = (ManagerTaskApplication.TaskApplication)(mTasksSendManager.Tasks[querytask.Name].Clone()); // десериализация задачи if (targetWriter.IsControlCommadVisible) { targetWriter.UserControlCommandTarget.SetNothigDataSourceForDataGridSend(); } targetWriter.ConfigSend.Clear(); targetWriter.ConfigSend.AddRow(COMMAND_NAME, taskSend.Name, TypeParam.String); targetWriter.ConfigSend.AddRow(COMMAND_DESCRIPTION, taskSend.Description, TypeParam.String); if (!(inNetCommandForTask.Parameters == null)) { if (inNetCommandForTask.Parameters.Length == taskSend.Parameters.Values.Count) { // скопировать в itemParameter значение parameters(itemParameter.Number - 1) foreach (var itemParameter in taskSend.Parameters.Values) { targetWriter.ConfigSend.AddRow($"{itemParameter.Number} {COMMAND_PARAMETER}", inNetCommandForTask.Parameters[itemParameter.Number - 1], itemParameter.Type); } } else { MessageBox.Show($"Число переданных параметров для исполнения не соответствует{Environment.NewLine}числу параметров в конфигурационном описании задачи.", $"Процедура <{nameof(SendRequestProgrammed)}>", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1); return; } } if (inNetCommandForTask.IsResponse) { targetWriter.ConfigSend.AddRow(INDEX, inNetCommandForTask.IndexResponse, TypeParam.String); } else { //Dim random As Random = RandomProvider.GetThreadRandom() //Dim random As Random = New Random(Convert.ToInt32((DateTime.Now.Millisecond >> 32))) targetWriter.ConfigSend.AddRow(INDEX, Convert.ToInt32(RandomProvider.GetThreadRandom().NextDouble() * (Math.Pow(2, 31))).ToString(), TypeParam.String); } targetWriter.ConfigSend.AddRow(COMMAND_COMMANDER_ID, $"Компьютер:<{System.Environment.MachineName}> соединение:<{targetWriter.HostName}> канал:<{targetWriter.NamePiepSend}>", TypeParam.String); SendXMLCommand(targetWriter); if (targetWriter.IsControlCommadVisible) { targetWriter.UserControlCommandTarget.UpdateDataGridSend(); } }
//Private syncPointDoMonitor As Integer = 0 'для синхронизации /// <summary> /// Отправить команды на все Targets. /// Вызыватся из одного обработчика таймера, /// если будут вызываться из разных потоков, /// то могут мешать друг другу, поэтому следует применять очередь команд в каждом target /// </summary> /// <remarks></remarks> private void SendCommandOutOfQueueFromAllTargets() { // не стал применять синхронизацию (syncPointDoMonitor), т.к. при выводе окна из родительской формы события таймера теряются //<MethodImplAttribute(MethodImplOptions.Synchronized)> foreach (Target itemTarget in ManagerAllTargets.ListTargets) { // '' Должна быть очередь команд для каждого компьютера. Какой-то сервис кладёт туда команду, а здесь происходит извлечение // ''--- Тест --------------------------------------------------------- //Dim random As Random = New Random(Convert.ToInt32((DateTime.Now.Millisecond >> 32))) //itemTarget.CommandWriterQueue.Enqueue(New NetCommandForTask("Clear Polynomial Channel", // New String() {((random.NextDouble) * 100).ToString, // "2", // "3", // "4", // "5", // "6", // "7"})) 'TODO: где-то занести значение в очередь // ''--- Тест --------------------------------------------------------- //Dim sync As Integer = Interlocked.CompareExchange(syncPointDoMonitor, 1, 0) //If sync = 0 Then if (itemTarget.CommandWriterQueue.Count > 0) { while (itemTarget.CommandWriterQueue.Count > 0) { NetCommandForTask mNetCommandForTask = itemTarget.CommandWriterQueue.Dequeue(); SendRequestProgrammed(itemTarget, mNetCommandForTask); // задача ни чего не дала //Dim tsk As Task = Task.Factory.StartNew(Sub() SendRequestProgrammed(itemTarget, mNetCommandForTask.NameCommand, mNetCommandForTask.Parameters)) //tsk.Wait() } } //syncPointDoMonitor = 0 ' освободить } //TODO: проверить не пришло ли время очистить буфера команд для target //If countTimedEvent > LIM_COUNT_TIMED_EVENT Then // countTimedEvent = 0 // For itemTarget As Target In ManagerAllTargets.ListTargets // SendRequestProgrammed(itemTarget, COMMAND_NOTHING) // Next //End If }