C# 我应该声明SerialPort';什么是已同步的回调?

C# 我应该声明SerialPort';什么是已同步的回调?,c#,.net,C#,.net,我在SerialPort的DataReceived事件中添加了一个回调。此回调访问某些类的属性。那么,这些属性是否必须声明为已同步?换句话说,当回调在某个属性上写入时,主线程是否可能访问该属性 这里我举一个例子: class A { private SerialPort serialPort; [MethodImpl(MethodImplOptions.Synchronized)] // <-- Is this necessary? public int Prop

我在
SerialPort
DataReceived
事件中添加了一个回调。此回调访问某些类的属性。那么,这些属性是否必须声明为
已同步
?换句话说,当回调在某个属性上写入时,主线程是否可能访问该属性

这里我举一个例子:

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++;
        };
    }

}
A类{
专用串行端口串行端口;
[MethodImpl(MethodImplOptions.Synchronized)]//{
Prop++;
};
}
}

这是可能的,但我不知道是否真的发生了,因为主线程的代码在这里不可见

如果两个线程访问Prop,那么它必须以某种形式同步。在这个演示代码中,
[MethodImpl(methodimpoptions.Synchronized)]
就足够了。但通常情况下,您希望保护更多的状态,而不仅仅是单个值。在这种情况下,您可能需要使用
lock
手动锁定


[MethodImpl(methodimpoptions.Synchronized)]
无论如何都是一种代码味道。我相信它只是为了Java兼容性。15年前,微软认为人们可能会经常想从Java迁移到.NET。

这是可能的,但我不知道这是否真的发生了,因为这里看不到主线程的代码

如果两个线程访问Prop,那么它必须以某种形式同步。在这个演示代码中,
[MethodImpl(methodimpoptions.Synchronized)]
就足够了。但通常情况下,您希望保护更多的状态,而不仅仅是单个值。在这种情况下,您可能需要使用
lock
手动锁定


[MethodImpl(methodimpoptions.Synchronized)]
无论如何都是一种代码味道。我相信它只是为了Java兼容性。15年前,微软认为人们可能希望大量从Java迁移到.NET。

DataReceived
事件在线程池线程上运行,因此多个线程很可能在该事件处理程序中访问您接触的任何数据。
DataReceived
事件在线程池线程上运行,因此,多个线程很可能正在访问您在事件处理程序期间接触到的任何数据。因此,请不要使用
[MethodImpl(methodimpoptions.Synchronized)]
我应该用
lock
语句编写属性的
get
set
方法?我可能这样做只是为了不依赖深奥的MethodImplOptions.Synchronized概念。所以,不要使用
[MethodImpl(MethodImplOptions.Synchronized)]
我应该用
lock
语句编写属性的
get
set
方法?我可能这样做只是为了不依赖深奥的MethodImplOptions.Synchronized概念。