這裏主要討論用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
導致這樣的結果的原因是一樣的。