我正在尝试解决这个问题(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
参考它。读取引用是一个原子操作。