如何在SmartThreadPool中创建STA线程

时间:2011-11-08 13:48:06

标签: c# .net visual-studio

我正在使用Ami Bar的SmartThreadPool http://www.codeproject.com/KB/threads/smartthreadpool.aspx

虽然有人提到可以生成STA线程,但我找不到一个例子。我想在我的池中创建所有STA线程。

3 个答案:

答案 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线程。创建它们的唯一方法是按如下方式修改源:

  1. StartSTAThreads 属性添加到 STPStartInfo 类。
  2. 添加

    if (_stpStartInfo.StartSTAThreads) 
    {
        workerThread.SetApartmentState(ApartmentState.STA);
    }
    
  3. workerThread.Start()调用之前

    SmartThreadPool.StartThreads 方法。