Метод Async.AwaitEvent<'Del,'T> (F#)
Создает асинхронное вычисление, которое ожидает однократного вызова события CLI, посредством добавления в это событие обработчика. По завершении или при отмене вычисления происходит удаление обработчика из события.
Пространство имен/путь к модулю: Microsoft.FSharp.Control
Сборка: FSharp.Core (в 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)
Параметры
event
Тип: IEvent<'Del,'T>Событие, предназначенное для однократной обработки.
cancelAction
Тип: (unit -> unit)Необязательная функция, выполняемая вместо отмены при выдаче отмены.
Возвращаемое значение
Асинхронное вычисление, которое ожидает вызов события.
Заметки
Вычисление прореагирует на отмену, ожидая событие. Если произошла отмена и указано действие cancelAction, это действие выполняется, и вычисление продолжает ожидать событие. Если действие cancelAction не указано, отмена вызывает немедленную отмену вычисления.
Пример
В следующем примере кода демонстрируется использование Async.AwaitEvent для задания операции файла, которая выполняется в ответ на событие, которое указывает, что файл изменился. В этом случае ожидание события предотвращает попытки получить доступ к файлу, пока он заблокирован.
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)
Пример результатов выполнения
Платформы
Windows 8, Windows 7, Windows Server 2012, Windows 2008 Server R2
Сведения о версии
Основной версии библиотеки F#
Поддерживается в: 2.0, 4.0, портативное