Постановка задачи Перспективы PIA
Когда Outlook завершает работу, любые события, зарегистрированные за помощью PIA будут потеряны, а также любые объекты PIA, которые в настоящее время в памяти будут недоступны.Как обрабатывать жизни приложения в реализации
Репродуцировать
Вот простая консоль приложение, которое иллюстрирует проблему под рукой:
static void Main(string[] args)
{
var outlookApp = new Application();
var ns = outlookApp.GetNamespace("MAPI");
var calendar = ns.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);
var appointment = (AppointmentItem) calendar.Items.GetFirst();
((ApplicationEvents_11_Event) outlookApp).Quit +=
() => Console.WriteLine("Outlook is quitting");
while (true)
{
Console.WriteLine("Explorers: " + outlookApp.Explorers.Count);
Console.WriteLine("Folders: " + ns.Folders.Count);
Console.WriteLine("Items: " + calendar.Items.Count);
Console.WriteLine("Start date: " + appointment.Start);
Thread.Sleep(2000);
}
}
Когда я запускаю это приложение, он запускается экземпляр Outlook, в отдельном процессе (как показано в в системном трее), если Outlook еще не запущен. Есть три варианта, которые я знаю, что может привести к Quit
события пожара:
- Перспективы находится в «скрытом» состояние, и вышла, выбрав Выхода Теперь из контекстного меню значка в системном трее ,
- Outlook был запущен, когда приложение было запущено, и пользователь закрывает или выходит из запущенного проводника.
- Outlook не запускался, когда приложение было запущено, поэтому было запущено в «скрытом» состоянии, но затем пользователь запустил приложение Outlook, выполнив запуск, или выбрав Открыть Outlook из контекстного меню значок в системном трее. Затем пользователь закрывает или покидает запущенный проводник.
Каждый из них имеет тот же эффект на моей программе: Quit
событие вызывается, а затем один из моих попыток получить доступ к объекту Outlook, не удается с COMException
.
Вопрос
Что такое стандарт или рекомендуемый способ справиться с этим? Теоретически выход приложения может происходить асинхронно в любое время. Нужно ли мне ловить COMException
при любой операции, которая использует PIA и перезапускает операцию от вызова до new Application()
, если это исключение происходит? Это может быть сложно, в зависимости от сложности операции.
Что относительно обработчиков событий? Нужно ли отслеживать все обработчики событий, которые я добавил в объекты Outlook, а затем повторно добавлять их, если я получаю событие Application.Quit
?
Что относительно UX? Предположим, что пользователь выбрал Выход из из контекстного меню панели задач, после чего значок моментально появляется, потому что мое приложение обнаружило выход и повторно инициализировало все. Должен ли я открыть какой-то диалог, чтобы пользователь сообщил им, что мне нужно, чтобы приложение Outlook работало правильно?
Как насчет ситуации отключения системы? Предположительно, я получил бы событие SystemEvents.SessionEnding
, прежде чем я получу Application.Quit
из Outlook. Гарантировано ли это, или я должен ждать некоторое количество времени, прежде чем восстанавливать связь, чтобы увидеть, находится ли система в процессе опускания? Есть ли другой способ определить, находимся ли мы в состоянии окончания сеанса?
Извинения за многогранный вопрос. Ссылки на материалы для чтения приветствуются, если есть статья, которая уже рассматривает эту тему. Я не нашел один после хорошего поиска.