0

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

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

我应该如何使调用线程成为 STA?

4

1 回答 1

2

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

您必须创建自己的 Thread 对象(将新的 ThreadStart 传递给您的方法)并按照您已经指出的那样设置它的单元状态。该方法必须有自己的回调方式,因为据我所知,vanilla Threads 没有提供方便的方式。

如果您使用的是 .NET 4.0,您还可以选择将Tasks自定义 StaTaskScheduler一起使用,但这可能比它的价值更麻烦和/或复杂,因为它增加了很多依赖项。不过,它确实消除了回调问题。

于 2011-04-13T04:49:47.427 回答