我正在实现一个具有BeginSomething()
和EndSomething()
对的接口,我的实现方法是Execute()
所以我创建了一个Action action = Execute
,并在BeginSomething中调用action.BeginInvoke
,在EndSomething中调用action.EndInvoke
。但是我的Execute方法必须由其公寓状态为STA(单线程单元)的线程调用。通常这是通过调用Thread.SetApartmentState
来完成的,但在这种情况下我不知道哪个线程会调用我的方法。
我应该如何制作调用线程STA?
答案 0 :(得分:2)
如果您的类根据接口实现这些Begin / End对方法,那么您可以控制工作的实际完成方式。委托(其中Action是一个类型的泛型)将使用我认为的默认线程池,因此将由共享的可重用可用线程执行。由于搞乱线程池是不可行的,因此在这种情况下,直接代表是不可行的。
您必须创建自己的Thread对象(将新的ThreadStart传递给您的方法)并按照您已经指示的方式设置它的公寓状态。该方法只需要有自己的回调方式,因为vanilla Threads不能提供一种方便我的知识。
如果你使用的是.NET 4.0,你也可以选择使用Tasks和a custom StaTaskScheduler,但这可能比它的价值更多的麻烦和/或复杂,因为它增加了很多依赖。但它确实消除了回调问题。