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

導致這樣的結果的原因是一樣的。

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