Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 强制销毁订阅事件的对象_F# - Fatal编程技术网

F# 强制销毁订阅事件的对象

F# 强制销毁订阅事件的对象,f#,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.).

让我们看看下面的代码:

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
类型EventSource()=
让myEvent=Event()
做
let timer=新定时器。timer()
timer.appeased.Add(乐趣->myEvent.Trigger DateTime.UtcNow)

timer.Interval您可以使用IDisPobles:

类型DoStuff(eventSource:eventSource)=
让我们分享=
eventSource.OnEvent()
|>可观察。订阅(printfn“我得到时间:%A”)
接口IDisposable与成员t.Dispose()=disp.Dispose()
类型dostuff控制器()=
让可变activeObject:DoStuff选项=无
让eventSource=eventSource()
放过=
activeObject |>Option.iter(趣味ds->(ds:>IDisposable.Dispose())
此成员。开始()=
清除()

activeObject您可以使用IDisTables:

类型DoStuff(eventSource:eventSource)=
让我们分享=
eventSource.OnEvent()
|>可观察。订阅(printfn“我得到时间:%A”)
接口IDisposable与成员t.Dispose()=disp.Dispose()
类型dostuff控制器()=
让可变activeObject:DoStuff选项=无
让eventSource=eventSource()
放过=
activeObject |>Option.iter(趣味ds->(ds:>IDisposable.Dispose())
此成员。开始()=
清除()

activeObject是可观察的,类似于事件,因为一个回调必须完成,下一个回调才能通过?或者多个事件可以同时触发多个回调(需要一个锁)我从未使用过Observable,但我相信这种行为会让多个事件同时使用。我只是做了一些测试,就是这样。此外,锁也不会有帮助,因为在对象被释放后,在锁后面排队的事件仍然可以执行,这与事件相似,因为一个回调必须完成,下一个回调才能通过?或者多个事件可以同时触发多个回调(需要一个锁)我从未使用过Observable,但我相信这种行为会让多个事件同时使用。我只是做了一些测试,就是这样。此外,锁也不会有帮助,因为在释放对象之后,在锁后面排队的事件仍将执行