[翻译]为什么需要单线程套间(STAThread)

在Main方法的顶部,你会发现有趣的声明



[STAThread]

static void Main() {

许多人会问这是什么,实际中需要这个吗?

当单线程属性被应用,它将当前线程的套间状态改变成单线程。这里我们不详细讨论COM和线程,这个属性确保了当前线程和其他想通过COM与其交互的线程间的通信策略。当你使用依赖于你正在使用的特性的Windows窗体,它可以使用COM组件以便和系统组件进行交互。很好的例子就是剪贴板和文件对话框。

Windows窗体不支持多线程或者无线程套间。基于Windows窗体的应用应该始终声明它们使用的套间类型,不然一些组件会错误地初始化线程的套间状态。


如果应用不能控制当前线程的套间状态,它将启动一个新的线程。
下面是一个例子:

using System.Threading;

Thread t 
= new Thread(new ThreadStart(StartNewStaThread));

// Make sure to set the apartment state BEFORE starting the thread.
t.ApartmentState = ApartmentState.STA;
t.Start();

private void StartNewStaThread() {
    Application.Run(
new Form1());
}

相关文档:
  • INFO: Calling Shell Functions and Interfaces from a Multithreaded Apartment
  • Shell does not support MTA
  • Choosing the Threading Model

    可以使用 t.SetApartmentState(ApartmentState.STA)取代 using t.ApartmentState;  

  • 如果你不想人为的设置,你就应该将[STAThread]放在开始新的STA线程方法之前。

    Thread t = new Thread(new ThreadStart(StartNewStaThread));
    t.Start();

    [STAThread]
    private void StartNewStaThread() {
        Application.Run(
    new Form1());
    }




    原文:http://blogs.msdn.com/jfoscoding/archive/2005/04/07/406341.aspx
    posted @ 2007-09-23 09:23  神奇小子  阅读(1661)  评论(0编辑  收藏  举报