本文主要介绍三种向线程传递参数的方法,使用的例子依然是《C#多线程编程实例》。
这三种方法分别是:1、写一个类型,在构造函数中传参,而后在类型中写无参数函数,里面使用内部变量,从而达到传参的目的。2、使用lambda方法,通过直接调用已有的带参数函数,通过lambda表达式向线程传参。3、使用thread.start(object parameter)的方法。
其中,第二种方法与第一种方法其实比较类似。
using System;
using System.Threading;
namespace Chapter1.Recipe8
{
class Program
{
static void Main(string[] args)
{
var sample = new ThreadSample(10);
var t1 = new Thread(sample.CountNumbersInThreadSample);
t1.Name = "线程t1";
t1.Start();
t1.Join();
Console.WriteLine("--------------------------");
var t2 = new Thread(Count);
t2.Name = "线程t2";
t2.Start(8); //传入参数给线程
t2.Join();
Console.WriteLine("--------------------------");
var t3 = new Thread(() => CountNumbers(12));
t3.Name = "线程3";
t3.Start();
t3.Join();
Console.WriteLine("--------------------------");
int i = 10;
var t4 = new Thread(() => PrintNumber(i));
i = 20;
var t5 = new Thread(() => PrintNumber(i));
t4.Start();
t5.Start();
Console.Read();
}
static void Count(object iterations)
{
CountNumbers((int)iterations);
}
static void CountNumbers(int iterations)
{
for (int i = 1; i <= iterations; i++)
{
Thread.Sleep(TimeSpan.FromSeconds(0.5));
Console.WriteLine("{0} prints {1}", Thread.CurrentThread.Name, i);
}
}
static void PrintNumber(int number)
{
Console.WriteLine(number);
}
class ThreadSample
{
private readonly int _iterations;
public ThreadSample(int iterations)
{
_iterations = iterations;
}
public void CountNumbersInThreadSample()
{
for (int i = 1; i <= _iterations; i++)
{
Thread.Sleep(TimeSpan.FromSeconds(0.5));
Console.WriteLine("{0} prints {1}", Thread.CurrentThread.Name, i);
}
}
}
}
}
我们要向函数传入参数,用以确定迭代次数。在t1线程中,使用的是类ThreadSample。首先,生成一个实例sample并通过构造函数传入迭代参数,而后在将sample中的方法CountNumbersInThreadSample()作为线程t1,接着就start t1并且join等待。t3使用的lambda表达式:() => CountNumbers(12) 这种做法非常简洁,而且实质上与第一种方法相同。t2使用的是start(object)方法,但是由于只能接受object参数,所以需要转换为int。
t4和t5是为了说明虽然t4在t5之前就定义了thread,但是在他们start()前,i被改为20了,所以两个线程得到的参数都是20.