2011-04-13 54 views
0

我實現具有BeginSomething()EndSomething()對接口,以及我的實現是一個方法Execute()我可以修改BeginInvoke我的委託的線程的性質嗎?

所以我創建一個Action action = Execute,並調用BeginSomething action.BeginInvoke,並action.EndInvoke在EndSomething。但是,我的Execute方法必須由其公寓狀態爲STA(單線程單元)的線程調用。通常這是通過調用Thread.SetApartmentState完成的,但在這種情況下,我不知道哪個線程將調用我的方法。

我該如何讓調用線程STA?

回答

2

如果您的類正在按照接口實現這些Begin/End對方法,那麼您可以控制工作的實際完成方式。委託(Action的類型通用)將使用我相信的默認線程池,並且將由共享的可重用可用線程執行。由於搞亂線程池是不可行的,在這種情況下直接代表是不可行的。

您必須創建自己的Thread對象(將新的ThreadStart傳遞給您的方法),並按照您的指示設置其公寓狀態。該方法只需要有自己的回調方式,因爲vanilla線程並不能提供我所知的便捷方式。

如果您使用的是.NET 4.0,您還可以選擇使用Tasks以及a custom StaTaskScheduler,但由於它增加了很多依賴性,因此這可能比它的價值更麻煩和/或複雜。它確實消除了回調問題。

相關問題