钩子事件OutlookVSTO继续在主线程上工作我开发了一个OutlookVSTO插件。有些任务应该在后台线程上完成。通常,检查本地数据库中的内容或调用Web请求。阅读了几篇文章后,我放弃了在后台线程中调用Outlook对象模型(OOM)。我有一些wpf控件,我已经成功地使用.NET40TPL执行异步任务并在完成时在主VSTA线程中“完成”作业(即访问UI或OOM)。为此,我使用以下形式的语法:Tasktask=Task.Factory.StartNew(()=>{//执行与UI或OOM无关的长任务returnSomeResult();});//现在我需要访问OOMtask.ContinueWith((Tasktsk)=>{//使用使用OOM的SomeResult做一些聪明的事情},TaskScheduler.FromCurrentSynchronizationContext());到目前为止,一切都很好。但是现在我想在没有Form/WPF控件的情况下在OOM挂钩事件时做类似的事情。确切地说,我的问题来自TaskScheduler.FromCurrentSynchronizationContext()抛出异常这一事实。例如,项目inboxItems=...;inboxItems.ItemAdd+=AddNewInboxItems;privatevoidAddNewInboxItems(objectitem){Tasktask=Task.Factory.StartNew(()=>{//做与OOM无关的长任务returnSomeResult()});varscheduler=TaskScheduler.FromCurrentSynchronizationContext();/*OuchTaskScheduler.FromCurrentSynchronizationContext()throwsanInvalidOperationException,'ThecurrentSynchronizationContextmaynotbeusedasaTaskScheduler.(Continuetasker.'*/)=>{//使用使用OOM的SomeResult做一些聪明的事情}),scheduler};}/*OuchTaskScheduler.FromCurrentSynchronizationContext()throwsInvalidOperationException,'当前的SynchronizationContext不能用作TaskScheduler。'*/请注意,我尝试在插件初始化中创建一个TaskScheduler,并按照此处的建议将其放入单例中。但它不起作用,继续任务不是在所需的VSTA主线程中执行,而是在另一个线程中执行(使用VisualStudio进行了检查)。有任何想法吗?已知错误SynchronizationContext.Current可能在多个不应为空的地方(包括Office加载项)为空。该错误已在.NET4.5中修复。但由于我无法升级到.NET4.5,我必须找到一个解决方法。按照建议,尝试做:System.Threading.SynchronizationContext.SetSynchronizationContext(newWindowsFormsSynchronizationContext());初始化插件时。您可以使用SynchronizationContext类,它提供了跨各种同步模型传播同步上下文的基本功能。Post方法将异步消息调度到同步上下文,即Post方法发起异步请求发布消息。有关详细信息和示例代码,请参阅使用SynchronizationContext将事件发送回WinForms或WPFUI。仅供参考,Current属性允许获取当前线程的同步上下文。此属性对于将同步上下文从一个线程传播到另一个线程很有用。以上就是C#学习教程的全部内容:hook事件OutlookVSTO继续在主线程工作。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
