另一个线程中的可变集无法获得/保留值

本文关键字:保留 线程 另一个 | 更新日期: 2024-10-18 09:11:21

我试图在另一个线程中设置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;
    }
  }
}

另一个线程中的可变集无法获得/保留值

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

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

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

setNum几乎肯定还没有运行。由于它是在自己的线程上启动的,操作系统调度程序必须交换掉现有的线程,并开始运行新的线程。

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

如果你需要等待线程完成,Join它,这样你就可以阻塞直到它完成,并考虑使用不同的模式,如async/await,因为它在这种情况下不会那么混乱。