我尝试过使用volatile ....
q是一个全局类变量,应该能够被类中的任何成员访问。 我必须创建一个 线程t;在A班?
class A
{
string q;
public void SomeMethod ()
{
new Thread(Method ()).Start();
Console.WriteLine (q); //this writes out nothing
}
private void Method ()
{
q = "Hello World";
}
}
答案 0 :(得分:4)
主线程(执行Console.WriteLine(q)
的线程)正在运行该行,并在您启动的新线程之前退出,并有机会设置变量的值。
对线程同步做一些研究。
答案 1 :(得分:1)
试试这个(注意这是你的大脑掌握你的代码不起作用的原因。这不是建议使用模式 - 感谢Chris的评论):
class A
{
string q;
public void SomeMethod ()
{
new Thread(Method ()).Start();
//Add this so the thread finishes (not a good permanent solution)
Thread.Sleep(500);
Console.WriteLine (q); //this writes out nothing
}
private void Method ()
{
q = "Hello World";
}
}
为什么这会起作用?因为它为第一个线程提供了在写入控制台之前完成其工作的机会。这意味着一个线程正在写入而另一个线程正在设置。
现在,更好/更改q时,更好的方法是锁定变量。在这个例子中,一个简单的锁就可以了。只需在设置时和检索到写入控制台时锁定变量。
答案 2 :(得分:-1)
您没有阻止执行以等待新线程执行。如果你只是想让它写出来,你可以使用waitHandle或一个非常简单的布尔标志:
class A
{
string q;
bool hasBeenSet;
public void SomeMethod ()
{
new Thread(Method ()).Start();
while(!hasBeenSet)
{
Thread.Sleep(10);
}
Console.WriteLine (q); //this writes out nothing
}
private void Method ()
{
q = "Hello World";
hasBeenSet = true;
}
}
尽管如此,你应该对WaitHandles和同步对象/模式进行一些研究。