如何更新线程参数?
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 :(得分: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;
}
}