如何在F#中注册和实现.Net事件的事件处理程序?

Sco*_*rod 2 f#

如何在F#中注册和实现.Net事件的事件处理程序?

我查看了这个链接,但似乎有点冗长.

例:

namespace Core

open Lego.Ev3.Core
open Lego.Ev3.Desktop

type LegoExample() = 
    let _brick = Brick(BluetoothCommunication("COM3"))
    _brick.Changed += OnBrickChanged

    let OnBrickChanged = 
        // some logic goes here...
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 5

在F#中,事件表示为IEvent<T>从中继承的值,IObservable<T>因此它们只是普通值 - 而不是特殊的语言构造.

您可以使用以下Add方法注册处理程序:

type LegoExample() = 
    let brick = Brick(BluetoothCommunication("COM3"))
    do brick.Changed.Add(fun e ->
        // some logic goes here...
    )
Run Code Online (Sandbox Code Playgroud)

do如果要在构造函数中注册处理程序,则需要此处的关键字LegoExample.

或者,您也可以使用Observable模块中的各种功能- 这些功能实现类似于Rx提供的功能:

type LegoExample() = 
    let brick = Brick(BluetoothCommunication("COM3"))
    do brick.Changed
       |> Observable.filter (fun e -> ...)
       |> Observable.add (fun e ->
           // some logic goes here...
       )
Run Code Online (Sandbox Code Playgroud)

  • 最近还讨论了订阅事件不是线程安全的:http://stackoverflow.com/questions/35109354/using-f-event-in-multi-threaded-code (2认同)