给线程传送数据
如果需要给线程传送一些数据,可以采用两种方式。一种方式是使用带ParameterizedThreadStart委托参数的Thread构造函数,另一种方式是创建一个定制类,把线程的方法定义为实例方法,这样就可以初始化实例的数据,之后启动线程。
要给线程传送数据,需要某个存储数据的类或结构。这里定义了包含字符串的结构Data,也可以传送任意对象。
public struct Data
{
public string Message;
}
如果使用了ParameterizedThreadStart委托,线程的入口点必须有一个object类型的参数,返回类型为void。对象可以转换为数据,这里是把信息写入控制台。
static void ThreadMainWithParameters(object o)
{
Data d = (Data)o;
Console.WriteLine("Running in a thread, received {0}", d.Message);
}
在Thread类的构造函数中,可以将新的入口点赋予ThreadMainWithParameters,传送变量d,调用Start()方法。
static void Main()
{
Data d = new Data();
d.Message = "Info";
Thread t2 = new Thread(ThreadMainWithParameters);
t2.Start(d);
}
给新线程传送数据的另一种方式是定义一个类(参见类MyThread),在其中定义需要的字段,将线程的主方法定义为类的一个实例方法:
public class MyThread
{
private string data;
public MyThread(string data)
{
this.data = data;
}
public void ThreadMain()
{
Console.WriteLine("Running in a thread, data: {0}", data);
}
}
这样,就可以创建MyThread的一个对象,给Thread类的构造函数传送对象和Thread Main()方法。线程可以访问数据。
MyThread obj = new MyThread("info");
Thread t3 = new Thread(obj.ThreadMain);
t3.Start();