我正在使用Ami Bar的SmartThreadPool http://www.codeproject.com/KB/threads/smartthreadpool.aspx
虽然有人提到可以生成STA线程,但我找不到一个例子。我想在我的池中创建所有STA线程。
答案 0 :(得分:4)
这是一个坏主意。线程池线程的生命周期由它执行的代码决定,最好是短的和快速的。这是不 STA线程的规则,只要在该线程上创建的COM对象未完成,它就必须保持活动状态并引发消息循环。与TP线程非常不兼容的要求。无论如何,尝试这样做只会给你带来永无止境的痛苦,因为“已经与其底层RCW分离的COM对象无法使用”异常以及死锁。这就是.NET tp线程始终是MTA的原因。
您必须使用常规线程。
答案 1 :(得分:1)
为了完整性,current version确实支持STA线程:
STPStartInfo stpStartInfo = new STPStartInfo();
stpStartInfo.ApartmentState = ApartmentState.STA;
SmartThreadPool stp = new SmartThreadPool(stpStartInfo);
答案 2 :(得分:0)
我分析了源代码,发现SmartThreadPool不支持STA线程。创建它们的唯一方法是按如下方式修改源:
添加
if (_stpStartInfo.StartSTAThreads)
{
workerThread.SetApartmentState(ApartmentState.STA);
}
到 SmartThreadPool.StartThreads 方法。