让我们看下面的代码:
type EventSource () =
let myEvent = Event<DateTime>()
do
let timer = new Timers.Timer()
timer.Elapsed.Add (fun _ -> myEvent.Trigger DateTime.UtcNow)
timer.Interval <- TimeSpan.FromSeconds(1.).TotalMilliseconds
timer.Enabled <- true
timer.Start()
member this.OnEvent() =
myEvent.Publish
type DoStuff (eventSource: EventSource) =
// sometimes this object will self terminate its activity
do
eventSource.OnEvent().Add(fun t -> printfn "I got the time: %A" t)
type DoStuffController () =
let mutable activeObject : DoStuff option = None
let eventSource = EventSource()
member this.Start () =
activeObject <- Some (DoStuff(eventSource))
member this.Stop () =
-> destroy active object here
activeObject <- None
这是我遇到的问题的简化版本: 有一个模块可以生成事件。 然后有一个控制器将按需创建对象(一次提供一个),这些对象将订阅事件。 这些对象(DoStuff)可以自毁,也可以按需破坏。
由于对象已订阅事件,因此,如果删除对对象的任何引用,它将不会超出范围。
什么是强迫破坏的好方法? 由于对象可以自行决定是否完成其活动,因此我在考虑添加一种触发自毁的方法,因此可以从单一角度进行。 有什么优雅的方法吗?
它用于外部命令启动/停止进程的上下文中;一次只能有一个(它们是不同的,只是使用相同的基本抽象类)。 该操作的一部分需要订阅事件。
答案 0 :(得分:0)
您可以使用IDisposables:
type DoStuff (eventSource: EventSource) =
let disp =
eventSource.OnEvent()
|> Observable.subscribe(printfn "I got the time: %A")
interface IDisposable with member t.Dispose() = disp.Dispose()
type DoStuffController () =
let mutable activeObject : DoStuff option = None
let eventSource = EventSource()
let clear() =
activeObject |> Option.iter (fun ds -> (ds:>IDisposable).Dispose())
member this.Start () =
clear()
activeObject <- Some (new DoStuff(eventSource))
member this.Stop () =
clear()
activeObject <- None