强制销毁订阅事件的对象

时间:2020-09-24 22:58:26

标签: f#

让我们看下面的代码:

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)可以自毁,也可以按需破坏。

由于对象已订阅事件,因此,如果删除对对象的任何引用,它将不会超出范围。

什么是强迫破坏的好方法? 由于对象可以自行决定是否完成其活动,因此我在考虑添加一种触发自毁的方法,因此可以从单一角度进行。 有什么优雅的方法吗?

它用于外部命令启动/停止进程的上下文中;一次只能有一个(它们是不同的,只是使用相同的基本抽象类)。 该操作的一部分需要订阅事件。

1 个答案:

答案 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