程序函数入口中的线程设计

疑源:在用VS.Net生成的C#代码中有[STAThread]字段,[STAThread]static void Main(string[] args) {}经常使用“[STAThread]”进行线程设置,多有不解


STA不是单线程的意思.英文为single threaded apartment,是一种套间(或译为公寓)线程模式.其它的好像还有MTA(多线程套间)、Free     Thread(自由线程)。这个属性要加在主 Main 上。这个属性只在   Com   Interop   所用,如果全部是  managed  code   则无用。 []是用来表示Attributes   。

STA Thread并不表明应用程式的类型,和应用程序不搭界,恰相反,一个应用程序可以有多个线程.每个线程也可以有多个组件或对象.以前win16位系统的组件线程模式才真正是单线程.这是一种被淘汰了的模式.

线程模式用于处理组件在多线程的环境里并行与并互的方式.比如套间线程(STAThread)模式中接口跨线程传递必须被调度(Marshal),不调度直传肯定会失败!而MTA或FreeThread模式中的接口可以不经调度直接传递.

这种调度在特定的环境中非常影响性能(可有几百倍之差).如VB里只支持STAThread模式.FreeThread模式的组件会在里面表现成和跨进程一样慢!设计好了,可以大大提高CPU的利用率,极大地减少运行或响应时间.

C#中的[STAThread]属性是应用程序的套间初始化代码.可以直接理解成SDK里的CoInitialize(NULL); 

初始一个STA套间实际上是相当于开了一个消息窗口,所有调用经此窗口过程调度到组件内.

同理[MTAThread]可以理解成 CoInitializeEx (NULL,COINIT_MULTITHREADED )

线程模式是微软的COM基础中的极其重要的概念.一定要吃透!

posted on 2006-06-29 11:49  口俞克木公  阅读(191)  评论(0)    收藏  举报

导航