我可以修改BeginInvoke我的委托的线程的性质吗?

时间:2011-04-13 02:51:35

标签: .net com asynchronous begininvoke apartment-state

我正在实现一个具有BeginSomething()EndSomething()对的接口,我的实现方法是Execute()

所以我创建了一个Action action = Execute,并在BeginSomething中调用action.BeginInvoke,在EndSomething中调用action.EndInvoke。但是我的Execute方法必须由其公寓状态为STA(单线程单元)的线程调用。通常这是通过调用Thread.SetApartmentState来完成的,但在这种情况下我不知道哪个线程会调用我的方法。

我应该如何制作调用线程STA?

1 个答案:

答案 0 :(得分:2)

如果您的类根据接口实现这些Begin / End对方法,那么您可以控制工作的实际完成方式。委托(其中Action是一个类型的泛型)将使用我认为的默认线程池,因此将由共享的可重用可用线程执行。由于搞乱线程池是不可行的,因此在这种情况下,直接代表是不可行的。

您必须创建自己的Thread对象(将新的ThreadStart传递给您的方法)并按照您已经指示的方式设置它的公寓状态。该方法只需要有自己的回调方式,因为vanilla Threads不能提供一种方便我的知识。

如果你使用的是.NET 4.0,你也可以选择使用Tasksa custom StaTaskScheduler,但这可能比它的价值更多的麻烦和/或复杂,因为它增加了很多依赖。但它确实消除了回调问题。