C#thread没有设置另一个类的变量值?

时间:2013-05-30 07:26:41

标签: c# c#-4.0 c#-3.0

这是我的测试代码:

  class Program
{
    static void Main(string[] args)
    {
        new Thread(delegate() { runThread(); }).Start();

        Console.WriteLine(Global.test);
        Console.ReadKey();
    }
    private static void runThread()
    {
        Console.WriteLine("this is run thread");
        Global.test = "this is test from thread";

        Console.WriteLine(Global.test);
    }
}
public class Global
{

    public static string testV { get; set; }
}

我希望能够用线程设置“testV”值。 看起来Thread确实设置了值,但是当从main方法中检索testV值时,它什么也没有给出。 那是为什么?

2 个答案:

答案 0 :(得分:4)

无法保证在主线程调用Global.test之前设置WriteLine。要查看效果,您可以在写出之前尝试稍微休眠,以证明其他线程已经修改过它。

另外,值得注意的是全局静态testV不是线程安全的,因此未来的行为是未定义的。

答案 1 :(得分:1)

在您的特定情况下Console.WriteLine(Global.test);早于runThread运行。最简单的方法是使用Join

var thread = new Thread(delegate() { runThread(); }).Start();
thread.Join();

Console.WriteLine(Global.test);

但这绝对不适用于生产代码(对于手动创建线程也是如此)。