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