【问题标题】:can I modify the nature of the thread that will BeginInvoke my delegate?我可以修改将 BeginInvoke 我的委托的线程的性质吗?
【发布时间】:2011-04-13 02:51:34
【问题描述】:
我正在实现一个具有BeginSomething() 和EndSomething() 对的接口,我的实现是在Execute() 方法中
所以我创建了一个Action action = Execute,并在 BeginSomething 中调用 action.BeginInvoke,在 EndSomething 中调用 action.EndInvoke。但是,我的 Execute 方法必须由其单元状态为 STA(单线程单元)的线程调用。通常这是通过调用Thread.SetApartmentState 来完成的,但在这种情况下,我不知道哪个线程会调用我的方法。
我应该如何使调用线程成为 STA?
【问题讨论】:
标签:
.net
com
asynchronous
begininvoke
apartment-state
【解决方案1】:
如果您的类根据接口实现这些 Begin/End 对方法,那么您可以控制工作的实际完成方式。委托(其中 Action 是类型化的泛型)将使用我相信的默认线程池,因此将由共享的可重用可用线程执行。由于搞乱线程池是不可行的,在这种情况下直接委托是不行的。
您必须创建自己的 Thread 对象(将新的 ThreadStart 传递给您的方法)并按照您已经指出的那样设置它的单元状态。该方法必须有自己的回调方式,因为据我所知,vanilla Threads 没有提供方便的方式。
如果您使用的是 .NET 4.0,您还可以选择使用 Tasks 和 a custom StaTaskScheduler,但这可能比它的价值更麻烦和/或复杂,因为它增加了很多依赖项。不过,它确实消除了回调问题。