Share via


Async.AwaitEvent<'Del,'T>-Methode (F#)

Erstellt eine asynchrone Berechnung, die durch Hinzufügen eines Handlers zum Ereignis auf einen einzelnen Aufruf eines CLI-Ereignisses wartet. Sobald die Berechnung abgeschlossen ist oder abgebrochen wird, wird der Handler aus dem Ereignis entfernt.

Namespace/Modulpfad: Microsoft.FSharp.Control

Assembly: FSharp.Core (in FSharp.Core.dll)

// Signature:
static member AwaitEvent : IEvent<'Del,'T> * ?(unit -> unit) -> Async<'T> (requires delegate)

// Usage:
Async.AwaitEvent (event)
Async.AwaitEvent (event, cancelAction = cancelAction)

Parameter

  • event
    Typ: IEvent<'Del,'T>

    Das einmal zu behandelnde Ereignis.

  • cancelAction
    Typ: (unit -> unit)

    Eine optionale Funktion, die ausgeführt werden soll, anstatt einen Vorgang abzubrechen.

Rückgabewert

Eine asynchrone Berechnung, die auf das Ereignis wartet, das aufgerufen werden soll.

Hinweise

Die Berechnung reagiert auf einen Abbruch, während auf das Ereignis gewartet wird. Wenn ein Abbruch auftritt und cancelAction angegeben ist, erfolgt eine Ausführung, und die Berechnung wartet weiter auf das Ereignis. Wenn cancelAction nicht angegeben wird, wird die Berechnung durch den Abbruch unmittelbar beendet.

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, wie mit Async.AwaitEvent ein Dateivorgang eingerichtet wird, der als Reaktion auf ein Ereignis ausgeführt wird, das angibt, dass eine Datei geändert wird. In diesem Fall verhindert das Warten auf das Ereignis einen Versuch, auf die Datei zuzugreifen, während sie gesperrt ist.

open System.Windows.Forms
open System.IO

let filename = "longoutput.dat"
if File.Exists(filename) then
    File.Delete(filename)
let watcher = new FileSystemWatcher(Path = Directory.GetCurrentDirectory(),
                                    NotifyFilter = NotifyFilters.LastWrite,
                                    Filter = filename)
watcher.Changed.Add(fun args -> printfn "The file %s is changed." args.Name)
watcher.EnableRaisingEvents <- true

let testFile = File.CreateText("Test.txt")
testFile.WriteLine("Testing...")
testFile.Close()

let form = new Form(Text = "Test Form")
let buttonSpacing = 5
let button1 = new Button(Text = "Start")
let button2 = new Button(Text = "Start Invalid", Top = button1.Height + buttonSpacing)
let button3 = new Button(Text = "Cancel", Top = 2 * (button1.Height + buttonSpacing))
let label1 = new Label(Text = "", Width = 200, Top = 3 * (button1.Height + buttonSpacing))
let label2 = new Label(Text = "", Width = 200, Top = 4 * (button1.Height + buttonSpacing))
form.Controls.AddRange [| button1; button2; button3; label1 |]
form.Controls.Add(button1)

let bufferData = Array.zeroCreate<byte> 100000000

let async1 filename =
     async {
       printfn "Creating file %s." filename
       use outputFile = File.Create(filename)
       printfn "Attempting to write to file %s." filename
       do! outputFile.AsyncWrite(bufferData) 
     }

let async2 filename =
     async {
       printfn "Waiting for file system watcher notification."
       // If you omit the call to AwaitEvent, an exception is thrown that indicates that the
       // file is locked.
       let! args = Async.AwaitEvent(watcher.Changed)
       printfn "Attempting to open and read file %s." filename
       use inputFile = File.OpenRead(filename)
       let! buffer = inputFile.AsyncRead(100000000)
       printfn "Successfully read file %s." filename
       return buffer
     }   

button1.Click.Add(fun _ ->
                  // Start these as tasks simultaneously.
                  Async.StartAsTask(async1 filename) |> ignore
                  Async.StartAsTask(async2 filename) |> ignore
                  ())
button2.Click.Add(fun _ ->
                  Async.StartAsTask(async1 filename) |> ignore
                  Async.StartAsTask(async2 "longoutputX.dat")  |> ignore
                  ())
Application.Run(form)

Beispielausgabe

                

Plattformen

Windows 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2

Versionsinformationen

F#-Runtime

Unterstützt in: 2.0, 4.0

Silverlight

Unterstützt in: 3

Siehe auch

Weitere Ressourcen

Control.Async-Klasse (F#)

Microsoft.FSharp.Control-Namespace (F#)

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Juli 2010

Codebeispiel hinzugefügt.

Informationsergänzung.