我继承了VSTO Outlook加载项的一些代码。需要定期执行后台操作。该操作基本上使一些Web服务调用并将一些文件写入磁盘。它根本不访问Outlook对象模型。目前它被实现为连续运行的STA线程,其循环和休眠以实现何时进行工作,时间间隔是几分钟并且不需要特殊性准确。
声称在后台线程上的所有处理都在STA线程上完成,否则Outlook崩溃并指向我article。我对这篇文章的解释是,只有当我调用Outlook COM模型时才需要STA线程,否则我无法看到Outlook甚至会意识到另一个线程正在运行。
在我看来,我最好使用运行线程池线程上的工作的System.Threading.Timer
而不是阻塞Sleep
上的专用线程。我很乐意听到任何有过在办公室加载项中做这类事情的人的意见。
不,如果它不访问Office对象/方法,它可以是MTA。
您不应该处理辅助线程中的Outlook对象。当后台线程调用Office应用程序时,调用将自动封送在STA边界上。但是,无法保证Office应用程序可以在后台线程进行调用时处理该调用。最新的Outlook版本可能会检测此类跨线程调用并在运行时抛出异常。
请注意,.NET包含四个名为Timer
的类,每个类都提供不同的功能: