2011-05-04 63 views
5

我有一個測量儀器對象:最佳實踐(或進入/退出)

public class Instrument 
{ 
    public double Measure() 
    { 
    return 0; 
    } 
} 

予有需要做一些測量設備:

public class Device 
{ 
    public Instrument MeasuringInstrument { get; set; } 
    public void DoMeasuring() 
    { 
    var result = this.MeasuringInstrument.Measure(); 
    } 
} 

的測量儀器一次只能在一臺設備上運行,但許多設備可能使用同一臺儀器。我是線程新手,從我的理解來看,以下兩種解決方案都有警告。

public class Instrument 
{ 
    public double Measure() 
    { 
    lock(this) 
    { 
     return 0; 
    } 
    } 
} 

public class Device 
{ 
    public Instrument MeasuringInstrument { get; set; } 
    public void DoMeasuring() 
    { 
    lock(this.MeasurementInstrument) 
    { 
     var result = this.MeasuringInstrument.Measure(); 
    } 
    } 
} 

我讀過這是最好的鎖定私有對象,但我不知道該怎麼做,同時仍允許MeasuringInstrument要獲得/在設備上設置。有什麼建議麼?

謝謝了,

+0

後代:託管線程處理的最佳實踐http://msdn.microsoft.com/en-us/library/1c9txz50(v=vs.110).aspx – Brad 2014-04-21 14:38:44

回答

3

通常的模式是創建自己的私人object只是在明顯的選擇可能會在課堂外暴露的情況下鎖定,例如:

public class Instrument 
{ 
    private object thisLock = new object(); 

    public double Measure() 
    { 
     lock(this.thisLock) 
     { 
      return 0; 
     } 
    } 
} 

public class Device 
{ 
    public Instrument MeasuringInstrument { get; set; } 
    private object measuringInstrumentLock = new object(); 

    public void DoMeasuring() 
    { 
     lock(this.measuringInstrumentLock) 
     { 
      var result = this.MeasuringInstrument.Measure(); 
     } 
    } 
} 

此外,我懷疑你只需要這兩個鎖中的一個(DoMeasuring中的一個或Measure中的那個),但這取決於缺少的位。

+0

在設備的第二鎖不是必需的。 – 2011-05-04 04:35:55

+0

hii ..我是新的線程和鎖定...使用私人對象上的鎖..它的罰款。但請告訴我實際上「鎖定」的功能。我的意思是如果Instrument類有10個對象,那麼每個對象都有自己的Measure()副本。現在,鎖定的目的是什麼? – himanshu 2011-05-04 04:48:21

+1

@himanshu看看這個:http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx – 2011-05-04 04:50:21

5

如果您的instrument被多個devices使用,最佳做法是在您的instrument類中設置lock。所以第一個解決方案效果更好。

但它更好地創建一個新的鎖定對象,並在instrument類中使用它。

public class Instrument 
{ 
    Object lockKey = new Object(); 
    public double Measure() 
    { 
    lock(lockKey) 
    { 
     return 0; 
    } 
    } 
} 
+1

@frazin。我同意,但更好的答案會包括爲什麼它更好 – 2011-05-04 04:49:26