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