更新线程参数

时间:2011-08-09 21:49:20

标签: 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 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 ?
}

2 个答案:

答案 0 :(得分:0)

由于String是不可变数据结构,因此您无法进行此类操作(传递参数)。使用其他引用类型或类包裹字符串,并使用适当的方法修改基础字符串字段:

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

在您定义str的级别定义TextWrapper字段,然后实例化并将TextWrapper的实例传递给线程。

请参阅Yoda的非常好的文章Parameter passing in C#

答案 1 :(得分: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;
    }
}