如果后台线程不能访问Office对象模型,那么后台线程是否需要在MS Office加载项中作为STA线程运行?

问题描述 投票:0回答:2

我继承了VSTO Outlook加载项的一些代码。需要定期执行后台操作。该操作基本上使一些Web服务调用并将一些文件写入磁盘。它根本不访问Outlook对象模型。目前它被实现为连续运行的STA线程,其循环和休眠以实现何时进行工作,时间间隔是几分钟并且不需要特殊性准确。

声称在后台线程上的所有处理都在STA线程上完成,否则Outlook崩溃并指向我article。我对这篇文章的解释是,只有当我调用Outlook COM模型时才需要STA线程,否则我无法看到Outlook甚至会意识到另一个线程正在运行。

在我看来,我最好使用运行线程池线程上的工作的System.Threading.Timer而不是阻塞Sleep上的专用线程。我很乐意听到任何有过在办公室加载项中做这类事情的人的意见。

.net multithreading outlook vsto office-interop
2个回答
0
投票

不,如果它不访问Office对象/方法,它可以是MTA。


0
投票

您不应该处理辅助线程中的Outlook对象。当后台线程调用Office应用程序时,调用将自动封送在STA边界上。但是,无法保证Office应用程序可以在后台线程进行调用时处理该调用。最新的Outlook版本可能会检测此类跨线程调用并在运行时抛出异常。

请注意,.NET包含四个名为Timer的类,每个类都提供不同的功能:

  • System.Timers.Timer:定期发射一次事件。该类旨在用作多线程环境中的基于服务器或服务组件;它没有用户界面,在运行时不可见。
  • System.Threading.Timer:定期在线程池线程上执行单个回调方法。回调方法是在实例化定时器时定义的,无法更改。与System.Timers.Timer类一样,此类旨在用作多线程环境中的基于服务器或服务组件;它没有用户界面,在运行时不可见。
  • System.Windows.Forms.Timer(仅限.NET Framework):一种Windows窗体组件,可定期触发事件。该组件没有用户界面,专为在单线程环境中使用而设计。如果要在事件处理程序中访问Outlook对象,这是运行重复工作的推荐方法。
  • System.Web.UI.Timer(仅限.NET Framework):一种ASP.NET组件,它定期执行异步或同步网页回发。
© www.soinside.com 2019 - 2024. All rights reserved.