传递参数给线程的方法通常有两种方法:
一、利用多线程-创建线程一节中提到的ParameterizedThreadStart委托,它可以接收单个Object参数
public delegate void ParameterizedThreadStart (object obj);
例如:
class ThreadTest { static void Main() { Thread t = new Thread (Go); t.Start (true); } static void Go (object upperCase) { bool upper = (bool) upperCase; Console.WriteLine (upper ? "HELLO!" : "hello!"); } }
在整个例子中,编译器自动推断出ParameterizedThreadStart委托,因为Go方法接收一个单独的object参数,就像这样写:
Thread t = new Thread (new ParameterizedThreadStart (Go)); t.Start (true);
ParameterizedThreadStart的特性是在使用之前我们必需对我们想要的类型(这里是bool)进行装箱操作,并且它只能接收一个参数。
一个替代方案是使用一个ThreadStart形式的匿名方法调用一个普通的有参方法,代码如下:
public class ThreadTest { static void Main() { Thread t = new Thread(delegate() { WriteText("Hello"); }); t.Start(); } static void WriteText(string text) { Console.WriteLine(text); } }
优点是目标方法(这里是WriteText),可以接收任意数量的参数,并且没有装箱操作。
注意: 使用 ParameterizedThreadStart 委托不是传递数据的类型安全的方法,因为 System.Threading.Thread.Start(System.Object) 方法重载接受任何对象。一种替代方法是将线程过程和数据封装在帮助器类中,并使用 ThreadStart 委托执行线程过程。
二、利用线程辅助类+非静态入口方法
//线程辅助类 public class DoWork { private int a; private string b; public DoWork(int a, string b) { this.a = a; this.b = b; } //非静态入口方法 public void TProc() { Trace.WriteLine("线程启动 " + a.ToString() + " " + b); } } public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnCreateThread_Click(object sender, EventArgs e) { DoWork w = new DoWork(3, "abc"); //传入对象实例的方法 Thread t = new Thread(new ThreadStart(w.TProc)); t.Start(); } }