2013-05-30 44 views
0

這裏是我的測試代碼:C#線程不會設置另一個類的變量值?

class Program 
{ 
    static void Main(string[] args) 
    { 
     new Thread(delegate() { runThread(); }).Start(); 

     Console.WriteLine(Global.test); 
     Console.ReadKey(); 
    } 
    private static void runThread() 
    { 
     Console.WriteLine("this is run thread"); 
     Global.test = "this is test from thread"; 

     Console.WriteLine(Global.test); 
    } 
} 
public class Global 
{ 

    public static string testV { get; set; } 
} 

我希望能夠設置「testV」值與一個線程。 它看起來像Thread設置的值,但是當從main方法中檢索testV值時,它什麼也不給。 這是爲什麼?

+1

從主線程讀取可能發生在其他線程有機會寫入值 –

回答

4

不能保證Global.test已經在您的主線程調用WriteLine時設置。爲了看到效果,你可以在寫出它之前嘗試睡一會兒,以證明另一個線程修改了它。

另外,值得注意的是,全局靜態testV不是線程安全的,因此您的將來會出現未定義的行爲。

+0

之前我如何使它對於testV線程安全呢? – user1225072

+0

@ user1225072,請參閱:http://stackoverflow.com/questions/434890/is-a-string-property-itself-threadsafe –

1

在您的特定情況下,Console.WriteLine(Global.test);運行得比runThread更早。最簡單的方法是使用Join

var thread = new Thread(delegate() { runThread(); }).Start(); 
thread.Join(); 

Console.WriteLine(Global.test); 

但是這不是生產代碼,絕對(當時同樣是手動線程創建真正的太)。