c# – 挂起事件Outlook VSTO在主线程上继续工作

我开发了一个Outlook VSTO插件。一些任务应该在后台线程上进行。通常,检查本地数据库中的内容或调用Web请求。阅读几篇文章后,我放弃了在后台线程中调用Outlook对象模型(OOM)的想法。

我有一些wpf控件,我成功地设法使用.NET 40 TPL来执行异步任务,当完成“完成”主VSTA主题中的作业(即访问UI或OOM)时。

为此,我使用以下格式的语法:

Task<SomeResult> task = Task.Factory.StartNew(()=>{
    //Do long tasks that have nothing to do with UI or OOM
    return SomeResult();
});

//now I need to access the OOM
task.ContinueWith((Task<SomeResult> tsk) =>{
   //Do something clever using SomeResult that uses the OOM
},TaskScheduler.FromCurrentSynchronizationContext());

到现在为止还挺好。但是现在我想在没有Form / WPF控件的OOM中挂起一个事件时做类似的事情。确切地说,我的问题来自于TaskScheduler.FromCurrentSynchronizationContext()抛出异常的事实。

例如,

Items inboxItems = ...;
inboxItems.ItemAdd += AddNewInboxItems;

private void AddNewInboxItems(object item)
{
    Task<SomeResult> task = Task.Factory.StartNew(()=>{
    //Do long tasks that have nothing to do with OOM
    return SomeResult()});


   var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
   /* Ouch TaskScheduler.FromCurrentSynchronizationContext() throws an  InvalidOperationException, 'The current SynchronizationContext may not be used as    a TaskScheduler.' */
   task.ContinueWith((Task<SomeResult> tsk) =>{
       //Do something clever using SomeResult that uses the OOM
   }),scheduler};
}

/* Ouch TaskScheduler.FromCurrentSynchronizationContext() throws an InvalidOperationException, ‘The current SynchronizationContext may not be used as a TaskScheduler.’ */

注意,我试图在addin初始化中创建一个TaskScheduler,并将其放在一个单例中,如建议here.但是它不起作用,继续任务不是在所需的VSTA主线程中执行的,而是另一个(使用VisualStudio进行检查)。

任何想法 ?

最佳答案
有一些已知的错误,SynchronizationContext.Current可能在几个不应该(不包括office加载项)的地方为null。那个bug在.NET 4.5中修复了。但是,由于您无法升级到.NET 4.5,您必须找到解决方法。作为一个建议,尝试做:

System.Threading.SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());

初始化你的插件。

转载注明原文:c# – 挂起事件Outlook VSTO在主线程上继续工作 - 代码日志