F #-이벤트
이벤트를 통해 클래스는 서로간에 메시지를 보내고받을 수 있습니다.
GUI에서 이벤트는 키 누르기, 클릭, 마우스 이동 등과 같은 사용자 작업 또는 시스템 생성 알림과 같은 일부 발생입니다. 응용 프로그램은 이벤트가 발생할 때 응답해야합니다. 예를 들어, 인터럽트. 이벤트는 프로세스 간 통신에 사용됩니다.
객체는 동기식 메시지 전달을 통해 서로 통신합니다.
이벤트는 다른 기능에 첨부됩니다. 개체 등록callback 함수를 이벤트에 추가하고 이러한 콜백은 이벤트가 일부 객체에 의해 트리거 될 때 실행됩니다.
이벤트 클래스 및 이벤트 모듈
Control.Event < 'T> 클래스는 관찰 가능한 개체 또는 이벤트를 만드는 데 도움이됩니다.
그것은 이벤트와 함께 작업하기 위해 다음과 같은 인스턴스 멤버가 있습니다-
회원 | 기술 |
---|---|
게시 | 관찰을 일급 값으로 게시합니다. |
방아쇠 | 주어진 매개 변수를 사용하여 관찰을 트리거합니다. |
Control.Event 모듈은 이벤트 스트림을 관리하는 기능을 제공합니다-
값 | 기술 |
---|---|
추가 : ( 'T → 유닛) → 이벤트 <'Del, 'T> → 유닛 | 주어진 이벤트가 트리거 될 때마다 주어진 함수를 실행합니다. |
선택 : ( 'T →'U 옵션) → IEvent < 'Del,'T> → IEvent < 'U> | 원래 이벤트에서 선택한 메시지에서 발생하는 새 이벤트를 반환합니다. 선택 기능은 원본 메시지를 선택적 새 메시지로 가져옵니다. |
필터 : ( 'T → bool) → IEvent <'Del, 'T> → IEvent <'T> | 원래 이벤트를 수신하고 이벤트에 대한 인수가 지정된 함수를 전달할 때만 결과 이벤트를 트리거하는 새 이벤트를 반환합니다. |
맵 : ( 'T →'U) → IEvent < 'Del,'T> → IEvent < 'U> | 주어진 함수에 의해 변환 된 값을 전달하는 새 이벤트를 반환합니다. |
merge : IEvent < 'Del1,'T> → IEvent < 'Del2,'T> → IEvent < 'T> | 입력 이벤트 중 하나가 발생하면 출력 이벤트를 발생시킵니다. |
쌍으로 : IEvent < 'Del,'T> → IEvent < 'T *'T> | 입력 이벤트의 두 번째 및 후속 트리거에서 트리거되는 새 이벤트를 반환합니다. 그만큼Nth 입력 이벤트를 트리거하면 N-1th 과 Nth쌍으로 트리거. 전달 된 인수N-1th 트리거링은 숨겨진 내부 상태로 유지됩니다. Nth 트리거링이 발생합니다. |
파티션 : ( 'T → bool) → IEvent <'Del, 'T> → IEvent <'T> * IEvent < 'T> | 원래 이벤트를 수신하는 새 이벤트를 반환하고 이벤트 인수에 대한 술어 적용이 true를 반환하면 첫 번째 결과 이벤트를 트리거하고 false를 반환하면 두 번째 이벤트를 트리거합니다. |
스캔 : ( 'U →'T → 'U) →'U → IEvent < 'Del,'T> → IEvent < 'U> | 입력 이벤트에서 트리거 된 연속 값에 주어진 누적 함수를 적용한 결과로 구성된 새 이벤트를 반환합니다. 내부 상태 항목은 상태 매개 변수의 현재 값을 기록합니다. 누적 함수를 실행하는 동안 내부 상태는 잠기지 않으므로 입력 IEvent가 동시에 여러 스레드에 의해 트리거되지 않도록주의해야합니다. |
split : ( 'T → 선택 <'U1, 'U2>) → IEvent <'Del, 'T> → IEvent <'U1> * IEvent < 'U2> | 원래 이벤트를 수신하는 새 이벤트를 반환하고 이벤트 인수에 대한 함수의 응용 프로그램이 Choice1Of2를 반환하면 첫 번째 결과 이벤트를 트리거하고 Choice2Of2를 반환하면 두 번째 이벤트를 트리거합니다. |
이벤트 생성
이벤트는 Event수업. 이벤트 생성자는 이벤트를 만드는 데 사용됩니다.
예
type Worker(name : string, shift : string) =
let mutable _name = name;
let mutable _shift = shift;
let nameChanged = new Event<unit>() (* creates event *)
let shiftChanged = new Event<unit>() (* creates event *)
member this.Name
with get() = _name
and set(value) = _name <- value
member this.Shift
with get() = _shift
and set(value) = _shift <- value
그런 다음 리스너가 이벤트에 연결할 수 있도록 nameChanged 필드를 공용 멤버로 노출해야합니다. Publish 이벤트의 속성-
type Worker(name : string, shift : string) =
let mutable _name = name;
let mutable _shift = shift;
let nameChanged = new Event<unit>() (* creates event *)
let shiftChanged = new Event<unit>() (* creates event *)
member this.NameChanged = nameChanged.Publish (* exposed event handler *)
member this.ShiftChanged = shiftChanged.Publish (* exposed event handler *)
member this.Name
with get() = _name
and set(value) = _name <- value
nameChanged.Trigger() (* invokes event handler *)
member this.Shift
with get() = _shift
and set(value) = _shift <- value
shiftChanged.Trigger() (* invokes event handler *)
다음으로 이벤트 핸들러에 콜백을 추가합니다. 각 이벤트 핸들러는 여러 메소드를 제공하는 IEvent < 'T> 유형을 가지고 있습니다.
방법 | 기술 |
---|---|
val 추가 : 이벤트 :( 'T → 단위) → 단위 | 리스너 함수를 이벤트에 연결합니다. 이벤트가 시작되면 리스너가 호출됩니다. |
val AddHandler : 'del → 단위 | 처리기 대리자 개체를 이벤트에 연결합니다. 나중에 RemoveHandler를 사용하여 처리기를 제거 할 수 있습니다. 이벤트가 시작되면 리스너가 호출됩니다. |
val RemoveHandler : 'del → 단위 | 이벤트 리스너 저장소에서 리스너 대리자를 제거합니다. |
다음 섹션에서는 완전한 예를 제공합니다.
예
다음 예제는 위에서 논의한 개념과 기술을 보여줍니다.
type Worker(name : string, shift : string) =
let mutable _name = name;
let mutable _shift = shift;
let nameChanged = new Event<unit>() (* creates event *)
let shiftChanged = new Event<unit>() (* creates event *)
member this.NameChanged = nameChanged.Publish (* exposed event handler *)
member this.ShiftChanged = shiftChanged.Publish (* exposed event handler *)
member this.Name
with get() = _name
and set(value) =
_name <- value
nameChanged.Trigger() (* invokes event handler *)
member this.Shift
with get() = _shift
and set(value) =
_shift <- value
shiftChanged.Trigger() (* invokes event handler *)
let wk = new Worker("Wilson", "Evening")
wk.NameChanged.Add(fun () -> printfn "Worker changed name! New name: %s" wk.Name)
wk.Name <- "William"
wk.NameChanged.Add(fun () -> printfn "-- Another handler attached to NameChanged!")
wk.Name <- "Bill"
wk.ShiftChanged.Add(fun () -> printfn "Worker changed shift! New shift: %s" wk.Shift)
wk.Shift <- "Morning"
wk.ShiftChanged.Add(fun () -> printfn "-- Another handler attached to ShiftChanged!")
wk.Shift <- "Night"
프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다.
Worker changed name! New name: William
Worker changed name! New name: Bill
-- Another handler attached to NameChanged!
Worker changed shift! New shift: Morning
Worker changed shift! New shift: Night
-- Another handler attached to ShiftChanged!