我在C#多線程程序中遇到了一個不良行爲。我的一些靜態成員正在其他線程中釋放它們的值,而同一個聲明類型的一些靜態值不會丟失它們的值。C#靜態變量跨線程訪問
public class Context {
public Int32 ID { get; set; }
public String Name { get; set; }
public Context(Int32 NewID, String NewName){
this.ID = NewID;
this.Name = NewName;
}
}
public class Root {
public static Context MyContext;
public static Processor MyProcessor;
public Root(){
Root.MyContext = new Context(1,"Hal");
if(Root.MyContext.ID == null || Root.MyContext.ID != 1){
throw new Exception("Its bogus!") // Never gets thrown
}
if(Root.MyContext.Name == null || Root.MyContext.Name != "Hal"){
throw new Exception("It's VERY Bogus!"); // Never gets thrown
}
Root.MyProcessor = new MyProcessor();
Root.MyProcessor.Start();
}
}
public class Processor {
public Processor() {
}
public void Start(){
Thread T= new Thread (()=> {
if(Root.MyContext.Name == null || Root.MyContext.Name != "Hal"){
throw new Exception("Ive lost my value!"); // Never gets Thrown
}
if(Root.MyContext.ID == null){
throw new Exception("Ive lost my value!"); // Always gets thrown
}
});
}
}
這是一個線程突變問題,同時使用某些類型的靜態成員?
通常,可變靜態屬性不能很好地與併發性兼容。您可能應該限制該狀態的範圍,或確保在併發訪問時不會修改它。 – Servy
感謝您的回覆,屬性或字段成員?我根據目的在根類中使用了公共字段。 –
我的聲明同樣適用於屬性和字段。它們以某種形式都是可變的公共狀態。 – Servy