/// <summary> /// Запуск процесса закачки /// </summary> public void Start(decimal sessNo) { ProcessStartInfo psi = new ProcessStartInfo { Arguments = $"ETLApp.dll {sessNo} -h", FileName = "dotnet", RedirectStandardOutput = true, UseShellExecute = false, WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory }; prc = Process.Start(psi); ProcessID = prc.Id; prc.EnableRaisingEvents = true; Logger.WriteToTrace($"Процесс закачки \"{ProgramID}\" ({ProcessID}) запущен."); IsExecuting = true; // Событие запуска OnStart?.Invoke(this, EventArgs.Empty); prc.Exited += (s, a) => { Logger.WriteToTrace($"Процесс закачки \"{ProgramID}\" ({ProcessID}) завершён."); // Обновляем статус после окончания закачки LastStatus = GetStatus(sessNo); IsExecuting = false; OnExit?.Invoke(this, a); // После завершения процесса очищаем все обработчики OnStart?.GetInvocationList().ToList().ForEach(d => OnStart -= (StartEventHandler)d); OnExit?.GetInvocationList().ToList().ForEach(d => OnExit -= (ExitEventHandler)d); }; }
public virtual void GetExitElements(ref XmlDocument doc, ref XmlElement xState) { if (OnExit != null) { Delegate[] d = OnExit.GetInvocationList(); for (int i = 0; i < d.Count(); i++) { string name = d[i].Target.GetType().ToString(); XmlElement xExit = doc.CreateElement("Exit"); xExit.SetAttribute("ClassName", name); name = d[i].Method.Name; xExit.SetAttribute("EventName", name); xState.AppendChild(xExit); } } }