Async.AwaitEvent<'Del,'T> Yöntemi (F#)
Olaya bir işleyici ekleyerek tek bir CLI olayının çağırması için bekleyen zaman uyumsuz bir hesaplama oluşturur. Hesaplama tamamlandığında veya iptal edildiğinde, olay işleyici olaydan kaldırılır.
Ad alanı/modül yolu: Microsoft.FSharp.Control
Derleme: FSharp.Core (FSharp.Core.dll içinde)
// Signature:
static member AwaitEvent : IEvent<'Del,'T> * ?(unit -> unit) -> Async<'T> (requires delegate)
// Usage:
Async.AwaitEvent (event)
Async.AwaitEvent (event, cancelAction = cancelAction)
Parametreler
event
Tür: IEvent<'Del,'T>Bir kez işlenecek olay.
cancelAction
Tür: (birim -> birim)İptal söz konusu olduğunda bunun yerine yürütelecek isteğe bağlı işlev.
Dönüş Değeri
Olayın çağırılması için bekleyen zaman uyumsuz hesaplama.
Açıklamalar
Hesaplama olay için beklerken iptal yanıtı verir. İptal gerçekleşirse ve cancelAction belirtilmişse yürütülür ve olay için beklemeye devam eder. cancelAction belirtilmemişse, iptal hesaplamanın hemen iptal edilmesine neden olur.
Örnek
Aşağıdaki kod örneği nasıl kullanılacağını göstermektedir Async.AwaitEvent bir dosyanın değiştiğini gösteren bir olaya yanıt olarak çalışan bir dosya işlemi ayarlamak için. Bu durumda, olay bekleniyor kilitli olduğunda dosya erişim girişimi engeller.
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)
Örnek Çıktı
Platformlar
Windows 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2
Sürüm Bilgisi
F# Çalışma Zamanı
Desteklenir: 2.0, 4.0
Silverlight
Desteklenir: 3
Ayrıca bkz.
Başvuru
Microsoft.FSharp.Control İsim Uzayı (F#)
Değişiklik Geçmişi
Tarih |
Geçmiş |
Nedeni |
---|---|---|
Temmuz 2010 |
Eklenen kod örneği. |
Bilgi geliştirme. |