2015-12-08 4 views
0

Постановка задачи Перспективы 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 события пожара:

  1. Перспективы находится в «скрытом» состояние, и вышла, выбрав Выхода Теперь из контекстного меню значка в системном трее ,
  2. Outlook был запущен, когда приложение было запущено, и пользователь закрывает или выходит из запущенного проводника.
  3. Outlook не запускался, когда приложение было запущено, поэтому было запущено в «скрытом» состоянии, но затем пользователь запустил приложение Outlook, выполнив запуск, или выбрав Открыть Outlook из контекстного меню значок в системном трее. Затем пользователь закрывает или покидает запущенный проводник.

Каждый из них имеет тот же эффект на моей программе: Quit событие вызывается, а затем один из моих попыток получить доступ к объекту Outlook, не удается с COMException.

Вопрос

Что такое стандарт или рекомендуемый способ справиться с этим? Теоретически выход приложения может происходить асинхронно в любое время. Нужно ли мне ловить COMException при любой операции, которая использует PIA и перезапускает операцию от вызова до new Application(), если это исключение происходит? Это может быть сложно, в зависимости от сложности операции.

Что относительно обработчиков событий? Нужно ли отслеживать все обработчики событий, которые я добавил в объекты Outlook, а затем повторно добавлять их, если я получаю событие Application.Quit?

Что относительно UX? Предположим, что пользователь выбрал Выход из из контекстного меню панели задач, после чего значок моментально появляется, потому что мое приложение обнаружило выход и повторно инициализировало все. Должен ли я открыть какой-то диалог, чтобы пользователь сообщил им, что мне нужно, чтобы приложение Outlook работало правильно?

Как насчет ситуации отключения системы? Предположительно, я получил бы событие SystemEvents.SessionEnding, прежде чем я получу Application.Quit из Outlook. Гарантировано ли это, или я должен ждать некоторое количество времени, прежде чем восстанавливать связь, чтобы увидеть, находится ли система в процессе опускания? Есть ли другой способ определить, находимся ли мы в состоянии окончания сеанса?

Извинения за многогранный вопрос. Ссылки на материалы для чтения приветствуются, если есть статья, которая уже рассматривает эту тему. Я не нашел один после хорошего поиска.

ответ

0

Если приложение.Quit не запускается, вы можете подключить Explorer.Close и Inspector.Закрыть события и проверить, являются ли Aplication.Explorers.Count и Aplication.Inspectors.Count равными 0 (или 1, так как событие, которое вы обрабатываете, все еще имеет открытое окно).

Чтобы подключить эти события, отследите события Application.Explorers.NewExplorer и Application.Inspectors.NewInspector. Чтобы подключить исследователей и инспекторов, уже отображаемых Outlook, прокрутите коллекции Application.Explorers и Application.Inspectors при запуске.

Смежные вопросы