我遇到了一种情况,我不确定为什么我在多个线程中没有从属性中读取正确的属性值。我编写了一个小型控制台应用程序来说明这种情况
class Program
{
private static Test MyObject;
static void Main(string[] args)
{
MyObject = new Test();
Task.Run(() =>
{
var obj = MyObject as Test;
Console.WriteLine("1: " + obj.MyValue);
Update("Thread1");
Console.WriteLine("2: " + obj.MyValue);
});
Task.Run(() =>
{
var obj = MyObject as Test;
Console.WriteLine("3: " + obj.MyValue);
Thread.Sleep(100);
Update("Thread2");
Console.WriteLine("4: " + obj.MyValue);
});
void Update(string val)
{
lock (MyObject)
{
MyObject.MyValue = val;
}
}
Thread.Sleep(400);
Console.WriteLine("5: " + MyObject.MyValue);
}
}
class Test
{
public string MyValue { get; set; }
}
运行上面的行我得到这个输出
1:
2: Thread1
3:
4: Thread2
5: Thread2
我的期望是“3:”应该始终显示“3:Thread1”,因为同一对象已较早更新。但事实并非如此,我不确定我在这里缺少什么......有人可以解释一下吗?
只是一个小注意...如果您运行代码并得到不同的顺序,请重新运行它...我只对上面的顺序感兴趣。
慕田峪7331174
相关分类