是否可以使用在整个应用程序中共享的全局同步上下文?

时间:2018-05-04 04:34:53

标签: async-await vsto outlook-addin synchronizationcontext

我使用Outlook加载项应用。看起来Outlook对象没有Synchronization上下文,await在完成后不返回调用线程。我想知道是否有可能创建一个新的全局同步上下文并将其用于加载项应用程序中的所有等待命令?如果是,我该怎么做?我应该在等待调用之前将其设置为执行上下文属性吗?或者,有一个更好的解决方案吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

Outlook对象模型使用单线程单元模型,并且不提供任何开箱即用的同步上下文。而且,SynchronizationContext类属于.net框架中的BCL,而不是Outlook。

  

我想知道是否可以创建新的全局同步上下文并将其用于加载项应用程序中的所有等待命令?

是的,如果线程没有自己的SynchronizationContext实例与之关联。通过调用静态SynchronizationContext.SetSynchronizationContext方法,可以将正在运行的线程与同步上下文相关联。稍后,您可以使用SynchronizationContext.Current属性获取正在运行的线程的当前上下文。

  

如果是,我该怎么做?我应该在等待调用之前将其设置为执行上下文属性吗?

如果没有与当前线程(main)关联的同步上下文,则可以执行一次。通常,Windows窗体将在创建第一个表单的线程上安装WindowsFormsSynchronizationContext的实例。 (此线程通常称为" UI线程"。)此同步上下文调用在该线程上传递给它的委托。

答案 1 :(得分:0)

您可以使用Namespace.SyncObjects个收集和SyncObject.SyncStart / SyncEnd个活动。