C# 更新线程参数

C# 更新线程参数,c#,.net,multithreading,C#,.net,Multithreading,如何更新线程参数 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 valu

如何更新线程参数

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 ?
}
由于字符串是不可变的数据结构,所以不能通过传递参数来执行此类操作。使用其他引用类型或通过具有适当方法的类包装字符串,这些方法能够修改基础字符串字段:

class TextWrapper
{   
   public string TextValue 
   { 
       get; 
       set; 
   }  
}
在定义str的级别上定义TextWrapper字段,然后实例化TextWrapper实例并将其传递给线程


请参阅Yoda的非常好的文章:

与前面的答案不同,这应该在不传递变量的情况下实现相同的功能。 只需确保共享变量已锁定,以避免竞争条件

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;
    }
}