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);
     }
 }