这里主要讨论用Lambda表达式给Thread传递参数。
我们除了用ParameterizedThreadStart委托传递参数,还可以用lambda表达式为Thread传递参数,如下例子所示:
static void Main()
{
Thread t = new Thread ( () => Print ("Hello from t!") );
t.Start();
}
static void Print (string message)
{
Console.WriteLine (message);
}
这里使用了匿名函数:
void ()
{
Print("Hello from t!");
}
用Lambda表达式传递参数时需要注意参数的传递是否可能遭破坏,比如:
for (int i = 0; i < 10; i++)
new Thread (() => Console.Write (i)).Start();
它运行的结果,很有可能是这样的(并不如我们想象的):
0223557799
这部分原因是多线程共享使用了变量i。如果代码改为下面这样,那么就解决了这个问题:
for (int i = 0; i < 10; i++)
{
int temp = i;
new Thread (() => Console.Write (temp)).Start();
}
这个时候变量i的值给另一个临时内存temp,每一次执行新的线程开辟的是一个新的temp,因此结果如我们所愿。
如这个例子所示,我们也很容易写出下面这个很容易犯错的例子:
string text = "t1";
Thread t1 = new Thread ( () => Console.WriteLine (text) );
text = "t2";
Thread t2 = new Thread ( () => Console.WriteLine (text) );
t1.Start();
t2.Start();
程序的结果可能也并不如我们所愿,它的结果很可能如下:
t2
t2
导致这样的结果的原因是一样的。