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概念。