C# 线程(二)——匿名函数给线程Thread传递参数

这里主要讨论用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

导致这样的结果的原因是一样的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章