f#中的线程安全选项



我正在尝试解决这个问题(pdedo代码):

let myObject : T option = None
onEvent (fun t -> if myObject.IsSome then myObject.Value(t))
some logic (
while forever do
myObject <- Some T()
// do something
myObject <- None
// do something

我有一个对象,它的创建和销毁取决于一些外部参数。有一个even总是触发,它将数据要么由对象处理(如果它存在),要么被忽略。

这里的问题是:

if myObject.IsSome

myObject.Value

状态可能改变。有什么机制来处理这个问题吗?比如"期权"。以原子方式返回或不返回对象的TryGet ?

或者我可以使用其他机制吗?

我想我可以尝试直接在try/with节中获取对象值,但我希望有更干净的东西。

从可变单元中取出值并将其保存在局部变量中,然后您可以以线程安全的方式与局部变量交互:

onEvent (fun t -> 
let v = myObject
if v.IsSome then v.Value(t)
)

这样做是因为Option值本身是不可变的。myObject的每一次突变都会产生一个新的Option值,并使myObject参考它。读取引用是一个原子操作。