在另一个线程中设置的变量没有 obtain/retain 值
Varible set in another thread does not obtain/retain value
我试图在另一个线程中设置 类 属性 的值,但是 property/variable 没有获得该值。为什么会这样,我该如何解决。
这是演示问题的简单测试代码
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;
}
}
}
setNum
几乎 绝对 还没有 运行。由于您在自己的线程上启动它,OS 调度程序必须换出您现有的线程,并启动 运行 新线程。
在启动线程的指令和下一条指令之间发生这种情况的可能性几乎为零。
如果您需要等待线程完成,Join
它会阻塞直到它完成,并考虑使用不同的模式,如 async/await
,因为它在这种情况下不会那么混乱.
thread.Start();
Console.WriteLine(num); //Why is num not 50 by this point
出于同样的原因,当您刚刚发布消息时没有答案 - 开始线程(在 SO 上或在 .Net/native 代码中)并不意味着它会立即完成并获得良好的结论性结果。
您需要以某种方式等到完成(即查看 Thread.Join
)。
我试图在另一个线程中设置 类 属性 的值,但是 property/variable 没有获得该值。为什么会这样,我该如何解决。
这是演示问题的简单测试代码
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;
}
}
}
setNum
几乎 绝对 还没有 运行。由于您在自己的线程上启动它,OS 调度程序必须换出您现有的线程,并启动 运行 新线程。
在启动线程的指令和下一条指令之间发生这种情况的可能性几乎为零。
如果您需要等待线程完成,Join
它会阻塞直到它完成,并考虑使用不同的模式,如 async/await
,因为它在这种情况下不会那么混乱.
thread.Start();
Console.WriteLine(num); //Why is num not 50 by this point
出于同样的原因,当您刚刚发布消息时没有答案 - 开始线程(在 SO 上或在 .Net/native 代码中)并不意味着它会立即完成并获得良好的结论性结果。
您需要以某种方式等到完成(即查看 Thread.Join
)。