private void ApplyChanges(OnTaskStatusChangeDelegate changeDelegate) { Dictionary <string, string> taskParams = new Dictionary <string, string>() { { "QueryService", ((ServiceInfo)InputData["SourceObject"]).Name }, }; if (StartupTypeChanged) { taskParams.Add("StartType", ((int)NewServiceStartMode).ToString()); } if (LogOnPasswordChanged) { taskParams.Add("Password", NewLogOnPassword); } if (LogOnNameChanged) { taskParams.Add("ServiceStartName", NewLogOnName); } ParentTabView.SubmitTaskAsync(ParentTabView.ConfigureServiceTaskId, ParentTabView.ManagementObject, taskParams, changeDelegate); }
private void OnTaskStatusChange(Guid batchId, IList <Microsoft.EnterpriseManagement.Runtime.TaskResult> results, bool completed) { Dbg.Log($"Entering {MethodBase.GetCurrentMethod().Name}"); if (results == null) { return; } if (!IsHandleCreated) { return; } lock (onTaskStatusChangeLock) { Guid taskId = Guid.Empty; try { taskId = results?.FirstOrDefault()?.TaskId ?? Guid.Empty; OnTaskStatusChangeDelegate taskCallback = MPTasks[taskId].TaskCallbacks[batchId]; if (taskId != Guid.Empty && taskCallback != null) { if (taskCallback.Target is System.Windows.Forms.Control callbackControl) { try { callbackControl.Invoke(taskCallback, new object[] { results, completed }); } catch { } } } if (completed && taskId != Guid.Empty) { MPTasks[taskId].TaskCallbacks.Remove(batchId); } } catch { } if (taskId != Guid.Empty) { try { int tasksInProgress = MPTasks[taskId].TaskCallbacks.Count; if (tasksInProgress == 0) { Invoke(new Action <string>(UpdateTaskStatus), new object[] { "" }); } else { string msg = $"{tasksInProgress} task{(tasksInProgress == 1 ? "" : "s")} {(tasksInProgress == 1 ? "is" : "are")} waiting to complete..."; Invoke(new Action <string>(UpdateTaskStatus), new object[] { msg }); } Dbg.Log($"Callback dictionary size: {tasksInProgress}"); } catch { Invoke(new Action <string>(UpdateTaskStatus), new object[] { "" }); } } } }
public void SubmitTaskAsync(Guid taskId, EnterpriseManagementObject mo, Dictionary <string, string> taskParameters, OnTaskStatusChangeDelegate statusChangeCallback) { Dbg.Log($"Entering {MethodBase.GetCurrentMethod().Name}"); try { if (!MPTasks.ContainsKey(taskId)) { GetTaskObjects(taskId); } if (MPTasks.ContainsKey(taskId)) { Microsoft.EnterpriseManagement.Runtime.TaskConfiguration taskParams = new Microsoft.EnterpriseManagement.Runtime.TaskConfiguration(); if (taskParameters != null) { foreach (KeyValuePair <string, string> paramPair in taskParameters) { taskParams.Overrides.Add(new Pair <ManagementPackOverrideableParameter, string>(MPTasks[taskId].OverrideableParameters[paramPair.Key], paramPair.Value)); } } UpdateTaskStatus("Starting a new task..."); Guid batchId = ManagementGroup.TaskRuntime.SubmitTask(mo, MPTasks[taskId].ManagementPackTask, taskParams, new Microsoft.EnterpriseManagement.Runtime.TaskStatusChangeCallback(OnTaskStatusChange)); MPTasks[taskId].TaskCallbacks.Add(batchId, statusChangeCallback); UpdateTaskStatus("Waiting on task completion..."); } } catch (Exception e) { MessageBox.Show($"Failed to start task.\r\nError message: {e.Message}.", "Task Failure", MessageBoxButtons.OK, MessageBoxIcon.Error); } }