STAThread属性是需求还是推荐?

时间:2015-05-15 13:24:01

标签: c# .net multithreading

我为AutoCAD编写了托管扩展程序。当AutoCAD加载扩展时,它会启动一些IExtensionApplication.Initialize()方法。我需要这个方法将在应用程序的主Thread中启动。为此目的设置此方法的STAThread属性是否足够?此属性是要求还是推荐

2 个答案:

答案 0 :(得分:4)

[STAThread]属性仅适用于独立可执行程序的Main()入口点。它是对操作系统的 promise ,告诉它程序的主线程“表现良好”。它必须泵出一个消息循环,永远不会阻塞。违背承诺导致难以诊断不当行为,僵局很常见。

编写AutoCAD扩展时,这些都不适用。 AutoCAD没有创建线程。您无法做出任何承诺,AutoCAD必须实现它们。它也不是一个“主线”,这个术语只适用于一个独立的程序。

调用您的扩展的线程几乎肯定已经是单线程的公寓,您可以在代码中使用Thread.GetApartmentState()进行仔细检查。 STA是显示UI的线程的要求,这是您在扩展中非常常见的事情。

答案 1 :(得分:2)

STA是COM对象的线程公寓策略 对于许多具有COM对象底层实现的UI对象,需要此线程策略 这就是为什么在创建新项目时,Windows窗体应用程序中的主线程设置为STA。

如果您没有使用任何需要STA策略的COM对象,那么您不需要它。