更新线程参数

本文关键字:参数 线程 更新 | 更新日期: 2023-09-27 18:05:06

如何更新线程参数?

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

更新线程参数

由于String是不可变数据结构,您不能进行此类操作(传递参数)。使用其他引用类型或由具有能够修改底层字符串字段的适当方法的类包装字符串:

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

在定义str的层次上定义TextWrapper字段,然后实例化并将TextWrapper的实例传递给线程。

参见Yoda的好文章: c#中的参数传递

与前面的答案不同,这应该在不传递变量的情况下完成相同的操作。只要确保共享变量是锁定的,以避免竞争条件。

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