Chr*_*phe 2 c# multithreading locking interlocked task
我有一个应用程序,它不断(+-100 毫秒)从 PLC 读取订单,然后将它们放入一个模型中,然后由多个客户端读取。为此,我使用 lock 语句。
订单阅读线程:
lock (model) {
//update object
}
Run Code Online (Sandbox Code Playgroud)
客户阅读:
lock (model) {
//serialize object to json string
}
send over tcp stream to client.
Run Code Online (Sandbox Code Playgroud)
但我也可以用于更新:
Interlocked.ExChange(oldObj, newObj)
Run Code Online (Sandbox Code Playgroud)
我不希望我的客户必须等待订单读取线程中发生的锁定。而且我绝对不希望客户阻止我的订单阅读线程。
我最好使用 Interlocked 吗?
感谢您的建议!
是的,您最好使用Interlocked它,因为它更有效,因为它主要被转换为单个原子操作。
但是,如果您不介意客户端仍然读取旧对象,您甚至可以不使用 Interlocked 并设置一个新实例。
碰巧获得新实例的客户端将获得更新的数据,而那些没有获得的客户端将在接下来的检查之一中获得它。