另一个线程中的可变集无法获得/保留值
本文关键字:保留 线程 另一个 | 更新日期: 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
,因为它在这种情况下不会那么混乱。