因为共享text
。线程t1可以在线程t1可以打印任何东西之前开始(在后台)并且文本可以被分配给t2。所以两者都打印t2。如果事情发生得足够快,它可能会偶尔打印t1,然后是t2。
因为一个简单的例子给出我会给出一个简单的解决方案(虽然不是太有用):
string text = "t1";
Thread t1 = new Thread(() => Console.WriteLine(text));
t1.Start(); // why do not print 't1'?
t1.Join(); // Wait for thread t1 to finish before continuing
text = "t2";
Thread t2 = new Thread(() => Console.WriteLine(text));
t2.Start(); // print 't2'
所不同的是,你等待的线程T1完成分配text
新值之前执行。我只给这个例子说明如何使用Join来等待一个线程完成。
稍微复杂一点的方法是不使用Lamda表达式。如果您创建一个静态函数来完成工作,你可以通过一个单一的参数(任何类型的object
)的线程启动功能:
public static void DoPrint(object data)
{
Console.WriteLine((String)data);
}
static void Main(string[] args)
{
string text = "t1";
Thread t1 = new Thread(DoPrint);
t1.Start(String.Copy(text)); // Pass a copy of text to Thread and start
text = "t2"
Thread t2 = new Thread(DoPrint);
t2.Start(String.Copy(text)); // Pass a copy of text to Thread and start
}
注意我们是如何使文本数据的副本传递之前。即使text = "t2"
在线程t1打印之前完成,它也不会影响,因为副本已通过。有两个开始线:
t1.Start(text);
t2.Start(text);
然后,我们将有同样的问题作为原来的例子出于同样的原因。文本是一个字符串,字符串是一个Class,因此它们通过引用传递。
运行足够多的时间,它实际上可能会偶尔 – 2014-09-06 06:29:09
而不是downvoting他的问题,只是向他提供一些建议。 – RajeshKannan 2014-09-06 06:33:10