Delirium
04-12-2009, 01:52
Имеется приложение на C#. В приложении есть опция - создать отчет. Отчет формируется в Excel.
//экземпляр Excel
oXL = new Excel.Application();
//экземпляр книги
oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value));
//экземпляр листа
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
и т.д. Т.е. все стандартно. Формирование отчета запускается в параллельном потоке, и после завершения формирования отчет выводится на экран (excel.Visible=true). Все работает, но иногда, крайне редко (например, отчет слишком большой, а пользователь закрыл программу и забыл что формировал его) в процессах остается экземпляр Excel.
Вот и подумал, может имеет смысл при закрытии программы проверять PID процессов Excel и закрывать их принудительно? В таком случае возникает проблема с уже запущенными клиентом копиями Excel.
Я думал взять список процессов Excel до запуска отчета и после
listBoxBefore.Text = System.Diagnostics.Process.GetProcessesByName("Excel")[0].Id.ToString();
listBoxAfter.Text = System.Diagnostics.Process.GetProcessesByName("Excel")[0].Id.ToString();
И при закрытии программы проверять, есть ли в списке новые PID. Но этот вариант мало подходит, т.к. пользователь мог во время работы программы сам запустить дополнительно Excel.
Может есть способ сразу при активации экземпляра Excel из программы, получать его PID? Чтобы быть уверенным на 100%, что закрывается нужное приложение.
//экземпляр Excel
oXL = new Excel.Application();
//экземпляр книги
oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value));
//экземпляр листа
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
и т.д. Т.е. все стандартно. Формирование отчета запускается в параллельном потоке, и после завершения формирования отчет выводится на экран (excel.Visible=true). Все работает, но иногда, крайне редко (например, отчет слишком большой, а пользователь закрыл программу и забыл что формировал его) в процессах остается экземпляр Excel.
Вот и подумал, может имеет смысл при закрытии программы проверять PID процессов Excel и закрывать их принудительно? В таком случае возникает проблема с уже запущенными клиентом копиями Excel.
Я думал взять список процессов Excel до запуска отчета и после
listBoxBefore.Text = System.Diagnostics.Process.GetProcessesByName("Excel")[0].Id.ToString();
listBoxAfter.Text = System.Diagnostics.Process.GetProcessesByName("Excel")[0].Id.ToString();
И при закрытии программы проверять, есть ли в списке новые PID. Но этот вариант мало подходит, т.к. пользователь мог во время работы программы сам запустить дополнительно Excel.
Может есть способ сразу при активации экземпляра Excel из программы, получать его PID? Чтобы быть уверенным на 100%, что закрывается нужное приложение.