Можно ли использовать глобальный контекст синхронизации, общий для всего приложения? - PullRequest
0 голосов
/ 04 мая 2018

Я работаю с надстройкой Outlook. Похоже, что объекты Outlook не имеют контекста синхронизации и await не возвращает вызывающий поток после завершения. Интересно, возможно ли создать новый глобальный контекст синхронизации и использовать его для всех команд await в приложении-надстройке? Если да, как я могу это сделать? Должен ли я установить его в качестве свойства контекста выполнения перед ожиданием вызова? Или есть лучшее решение для этого?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Объектная модель Outlook использует однопотоковую модель квартиры и не предоставляет никаких контекстов синхронизации "из коробки". Более того, класс SynchronizationContext принадлежит BCL из .net framework, а не Outlook.

Интересно, возможно ли создать новый глобальный контекст синхронизации и использовать его для всех команд await в приложении-надстройке?

Да, если у потока нет собственного экземпляра SynchronizationContext, связанного с ним. Работающий поток можно связать с контекстом синхронизации, вызвав статический метод SynchronizationContext.SetSynchronizationContext . Позже вы можете получить текущий контекст запущенного потока, используя свойство SynchronizationContext.Current.

Если да, как я могу это сделать? Должен ли я установить его как свойство контекста выполнения перед вызовом ожидания?

Вы можете сделать это один раз, если с текущим потоком (основным) не связан контекст синхронизации. Обычно Windows Forms устанавливает экземпляр WindowsFormsSynchronizationContext в потоке, в котором создается первая форма. (Этот поток обычно называют «потоком пользовательского интерфейса».) Этот контекст синхронизации вызывает делегаты, переданные ему именно в этот поток.

0 голосов
/ 04 мая 2018

Вы можете использовать Namespace.SyncObjects коллекцию и SyncObject.SyncStart / SyncEnd события.

...