2011-08-09 50 views
0

如何更新線程參數?更新線程參數

string str = "hello world"; 

private static Thread test = newThread(new ParameterizedThreadStart(invariant_loop)); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    test.Start(str); 
} 

private static void invariant_loop(object value) 
{ 
    do 
    { 
     System.Threading.Thread.Sleep(1000); 
     Console.WriteLine(value.ToString()); 
    } 
    while (true); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    str = maskedTextBox1.Text; // update value ? 
} 

回答

0

由於String是不可變的數據結構,因此您不能執行此類操作(傳遞參數)。使用其他引用類型或用適當方法的類包串能夠修改底層字符串場:

class TextWrapper 
{ 
    public string TextValue 
    { 
     get; 
     set; 
    } 
} 

定義你在哪裏已經定義str水平TextWrapper場,然後實例化,並通過TextWrapper的實例一個線程。

見尤達很好的文章:Parameter passing in C#

0

或者到前面的答案這應該完成同樣沒有通過一個變量。 只要確保共享變量已鎖定以避免競爭狀況。

string str = "hello world"; 
object str_lock = new object(); 

private Thread test = newThread(new ParameterizedThreadStart(invariant_loop)); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    test.Start(); 
} 

private void invariant_loop() 
{ 
    do 
    { 
     System.Threading.Thread.Sleep(1000); 
     lock(str_lock) { 
      Console.WriteLine(str); 
     } 
    } 
    while (true); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    lock(str_lock) { 
     str = maskedTextBox1.Text; 
    } 
}