另一个线程中的变量集不会获取/保留值

时间:2015-03-05 01:34:43

标签: c# multithreading thread-safety

我尝试在另一个线程中设置classes属性的值,但属性/变量不能获取该值。为什么会这样,我该如何解决呢。

以下是演示问题的简单测试代码

using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace Tests
{
  class MainClass
  {
    static void Main()
    {
      ClassA alpha = new ClassA();
      Console.ReadLine();
    }
  }

  class ClassA 
  {
    int num;

    public ClassA()
    {
      var thread =  new Thread(setNum);
      thread.Start();
      Console.WriteLine(num); //Why is num not 50 by this point
    }

    void setNum()
    {
      num = 50;
    }
  }
}

2 个答案:

答案 0 :(得分:3)

thread.Start();
Console.WriteLine(num); //Why is num not 50 by this point

出于同样的原因,当您刚刚发布消息时没有答案 - 启动线程(在SO或.Net /本机代码中)并不意味着它会立即完成并具有良好的结论。

您需要以某种方式等待完成(即查看Thread.Join)。

答案 1 :(得分:2)

setNum几乎肯定尚未投放。由于您是在自己的线程上启动它,因此OS调度程序必须换出现有的线程,并开始运行新线程。

启动线程的指令和下一个之间发生这种情况的可能性几乎为零。

如果您需要等待线程完成,Join它会阻塞直到完成,并考虑使用不同的模式,如async/await,因为它对于这样的情况来说不那么混乱。 / p>