2016-02-22 79 views
1

我在SerialPortDataReceived事件中添加了一個回調。此回調訪問某些類的屬性。那麼,這些屬性是否必須聲明爲​​?換句話說,主線程可能在回調寫入時訪問屬性?我應該聲明由SerialPort的回調加入的變量是否同步?

在這裏,我把一個例子:

class A { 
    private SerialPort serialPort; 

    [MethodImpl(MethodImplOptions.Synchronized)] // <-- Is this necessary? 
    public int Prop { get; set; } 

    public A(SerialPort sp){ 
     serialPort = sp; 
     serialPort.DataReceived += (Object sender, SerialDataReceivedEventArgs e) => { 
      Prop++; 
     }; 
    } 

} 
+0

DataReceived事件在一個線程池線程上運行,因此多線程很可能訪問您在該事件處理程序中觸摸的任何數據。 –

回答

0

這是可能的,但我不知道這是否真的是因爲主線程的代碼是不可見的在這裏。

如果兩個線程訪問Prop,那麼它必須以某種形式同步。在這個演示代碼中,[MethodImpl(MethodImplOptions.Synchronized)]就足夠了。但是,你通常想要保護更多的狀態而不僅僅是一個單一的值。在這種情況下,您可能需要使用lock手動鎖定。

[MethodImpl(MethodImplOptions.Synchronized)]無論如何是一種代碼味道。我相信它只存在於Java兼容性中。 15年前,微軟認爲人們可能希望從Java遷移到.NET。

+0

因此,而不是'[MethodImpl(MethodImplOptions.Synchronized)]'我應該用'lock'語句來寫屬性的get'和'set'方法? – Dan

+0

我可能會這樣做只是爲了不依賴於深奧的MethodImplOptions.Synchronized概念。 – usr

相關問題