Нужно ли фоновые потоки запускать как потоки STA в надстройках MS Office, если они не обращаются к объектной модели Office? - PullRequest
0 голосов
/ 06 марта 2019

Я унаследовал некоторый код для надстройки VSTO Outlook. Существует требование, чтобы фоновая операция выполнялась периодически. Операция в основном делает некоторый вызов веб-службы и записывает некоторые файлы на диск. Он вообще не обращается к объектной модели Outlook. На данный момент он реализован в виде потока STA, который работает непрерывно, зацикливаясь и засыпая, чтобы достичь времени, когда нужно выполнять работу, интервал времени составляет несколько минут и не должен быть точным.

Заявление о том, что вся обработка в фоновых потоках выполнялась в потоках STA, иначе Outlook вылетает и указывает на эту статью . Моя интерпретация этой статьи заключается в том, что поток STA требуется только в том случае, если я обращаюсь к модели COM COM Outlook, в противном случае я не вижу, как Outlook мог бы знать, что запущен другой поток.

Мне кажется, что было бы лучше использовать System.Threading.Timer, который запускает работу с потоком пула потоков, а не блокирует выделенный поток на Sleep. Я хотел бы услышать от любого, кто имеет опыт работы с подобными вещами в офисных надстройках.

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

Вы не должны иметь дело с объектами Outlook из вторичного потока. Когда фоновый поток выполняет вызов приложения Office, этот вызов автоматически маршалируется через границу STA. Однако нет никакой гарантии, что приложение Office сможет обработать вызов в тот момент, когда его выполняет фоновый поток. Последние версии Outlook могут обнаруживать такие межпоточные вызовы и генерировать исключения во время выполнения.

Имейте в виду, что .NET включает в себя четыре класса с именем Timer, каждый из которых предлагает различные функции:

  • System.Timers.Timer : запускает событие через равные промежутки времени. Класс предназначен для использования в качестве серверного или сервисного компонента в многопоточной среде; он не имеет пользовательского интерфейса и не виден во время выполнения.
  • System.Threading.Timer : выполняет один метод обратного вызова в потоке пула потоков через равные промежутки времени. Метод обратного вызова определяется, когда создается таймер, и его нельзя изменить. Как и класс System.Timers.Timer, этот класс предназначен для использования в качестве серверного или служебного компонента в многопоточной среде; он не имеет пользовательского интерфейса и не виден во время выполнения.
  • System.Windows.Forms.Timer (только .NET Framework): компонент Windows Forms, который запускает событие через регулярные промежутки времени. Компонент не имеет пользовательского интерфейса и предназначен для использования в однопоточной среде. Это рекомендуемый способ запуска повторяющейся работы, если вы хотите получить доступ к объектам Outlook в обработчике событий.
  • System.Web.UI.Timer (только .NET Framework): компонент ASP.NET, который выполняет асинхронные или синхронные обратные передачи веб-страниц с регулярным интервалом.
0 голосов
/ 06 марта 2019

Нет, если он не обращается к объектам / методам Office, это может быть MTA.

...