C#启动线程的几种方法

一、 最常见的就是使用参数为 ThreadStart类型的线程构造函数

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

可以写成 Thread t = new Thread(FunctionName);   这就是最基本的创建线程方法。但是ThreadStart是无参数的委托类型,这种方法也就不能直接给线程函数传递参数。但是线程函数可以直接访问他所在的类中的其他成员变量,参数可以设置在其他成员变量中,让线程函数去读取。

二、 使用参数为 ParameterizedThreadStart类型的线程构造函数

Thread t = new Thread(new ParameterizedThreadStart(FunctionName));

ParameterizedThreadStart也是一个委托类型,其委托的函数必须带一个object类型的参数。虽然只带一个object类型参数,但是可以把N个参数都包装进一个类对象,通过这个object参数直接把该对象传给线程,也就相当于传了N个参数,不过多了包装这步。

三、 直接采用异步委托调用

受委托的函数可以拥有任何数量和类型的参数。线程的本质实际上也是异步委托调用,线程类Thread也可以看成是对异步委托调用的一层封装,当然多一层封装后灵活性就降低了(体现在参数数量和类型被限定),但是方便使用。

如果直接采取异步委托调用的方式,必须自己协调多个线程之间的同步问题,这个工作原来是由Thread类替我们完成了。换句话说,是在方便和灵活之间做一个选择。通常使用现成的Thread类已可以应付所有操作。

四、 创建内嵌的线程类

这种方法把线程要完成的工作及其资源包装成一个类,符合面向对象的思想。这个类不一定要是内嵌类,但是对于winform程序来说,如果不是内嵌类,就意味着无法访问Form类上的控件、修改程序界面。

内嵌类本身是个非常麻烦的概念。他可以访问外部类的private成员变量和方法,但是之前必须加上一个外部对象的引用,所以在内嵌类中通常需要有一个成员变量用来持有对外部对象的引用,可以在内嵌类的构造函数中把外部对象的引用作为参数传递、赋值给该变量。有了这个引用,内嵌类才能在堆内存中找到外部对象,找到以后即使是外部对象中的private成员,内嵌类也是有权限访问的。

posted @ 2010-01-07 14:01  wzh0717  阅读(28104)  评论(1编辑  收藏  举报