我正在考虑使用此代码来检测线程是否是主(UI)线程。
public static bool IsMainThread()
{
return Thread.CurrentThread.GetApartmentState() == ApartmentState.STA;
}
当然,工作线程运行任务返回false时工作正常,只是想知道它是否通常是真的。
如果它是相关的,这是一个WPF应用程序。
这与我的另一个问题相似:How do I assert that the code is running in the main thread?但是没有人建议这个解决方案。
答案 0 :(得分:1)
是的,您可以在创建STA时在其他线程上设置STA。线程池线程在MTA中。
答案 1 :(得分:1)
是的,你可以让多个线程拥有STA公寓。但是你不能在线程之间交换框架元素,这仍然会导致错误。这意味着您无法创建文本框控件并将其填充到也是STA的工作线程中,然后将其传递给主线程(也是STA)并将其添加到表单中。这仍然会导致错误。所以问题是,为什么要为STA设置多个线程?
答案 2 :(得分:1)
根据STAThreadAttribute的文档,你不能有多个STA的线程(除非你使用COM互操作,否则你甚至不能真正拥有一个)。
“将此属性应用于入口点方法(C#和Visual Basic中的Main()方法)。它对其他方法没有影响。”
自.Net 2.0起,单线程单元仅用于执行COM互操作时。
“COM线程模型仅适用于使用COM互操作的应用程序。在不使用COM互操作的应用程序中使用此属性不起作用。”
“在.NET Framework 2.0版中,新线程初始化为ApartmentState.MTA,如果它们的公寓状态在启动之前尚未设置。默认情况下,主应用程序线程初始化为ApartmentState.MTA。”
参考:http://msdn.microsoft.com/en-us/library/system.stathreadattribute(v=vs.100).aspx