Sdílet prostřednictvím


Asynchronní pracovní postupy (F#)

Toto téma popisuje podporu v F# pro provádění výpočty asynchronně, bez blokování provedení jiné práce.Například asynchronní výpočty lze psát aplikace, které mají uživatelského rozhraní, které zůstávají uživatelům reagovat aplikace provádí jinou práci.

async { expression }

Poznámky

V syntaxi předchozí výpočtu reprezentované expression nastavit spustit asynchronně, bez blokování aktuální podproces výpočtu při provádění operace asynchronní režim spánku, I/O a jiné asynchronní operace.Asynchronní výpočty často na podprocesem na pozadí spuštěn, zatímco pokračuje v provádění podprocesu.Typ výrazu je Async<'a>, kde 'a je typ vrácených výraz když return se používá klíčové slovo.Kód v takový výraz je označována jako asynchronní blok, nebo bloku asynchronní.

Existují různé způsoby asynchronně, programování a asynchronní třída poskytuje metody, které podporují několik scénářů.Obecný přístup je vytvoření Async objekty, které představují výpočet nebo výpočty, které chcete spustit asynchronně a pak tyto výpočty pomocí spouštěcího funkcí.Různé funkce spouštěcí poskytují různé způsoby spuštění asynchronního výpočty a které jedno použití závisí na tom, zda chcete použít aktuální podproces podprocesem na pozadí nebo.NET Framework objekt úlohy, a zda jsou pokračování funkce, které by spustit po dokončení výpočtu.Například spuštění asynchronního výpočtu podprocesu, můžete použít Async.StartImmediate.Při spuštění asynchronního výpočtu z uživatelské rozhraní blokovat smyčky hlavní událost, která zpracovává akce uživatele, například stisknutí kláves a myši činnosti tak zůstane aplikace přestane reagovat.

Asynchronní vazby pomocí umožňují!

V pracovním postupu asynchronní některé výrazy a operace jsou synchronní a některé jsou delší výpočty, které jsou určeny pro vrácení výsledku asynchronně.Při volání metody asynchronně, namísto běžných let vazbu, použijte let!.Efekt let! je umožnit spuštění pokračovat na další výpočty nebo podprocesů, provádí výpočet.Po pravé straně let! vazby Vrátí zbytek asynchronní pracovní postup pokračuje v provádění.

Následující kód ukazuje rozdíl mezi let a let!.Řádek kódu, který používá let pouze vytváří asynchronní výpočtu jako objekt, který můžete spustit později pomocí, například Async.StartImmediate nebo Async.RunSynchronously.Řádek kódu, který používá let! spustí výpočtu a potom podproces je pozastaven, dokud k dispozici, na které bod spuštění pokračuje.

// let just stores the result as an asynchronous operation.
let (result1 : Async<byte[]>) = stream.AsyncRead(bufferSize)
// let! completes the asynchronous operation and returns the data.
let! (result2 : byte[])  = stream.AsyncRead(bufferSize)

Kromě let!, můžete použít use! provádět asynchronní vazby.Rozdíl mezi let! a use! je stejný jako rozdíl mezi let a use.Pro use!, objekt vyřazen na konci aktuálního oboru.Všimněte si, že v aktuální verzi jazyka F# use! nepovoluje hodnotu inicializována Null, přestože use nemá.

Asynchronní primitiv.

Volání metody, který provádí jeden úkol asynchronní a výsledek vrátí asynchronní základní, a jsou vytvořeny speciálně pro použití s let!.Několik asynchronních prvky jsou definovány v základní knihovně F#.Tyto dvě metody pro webové aplikace, které jsou definovány v modulu Microsoft.FSharp.Control.WebExtensions: WebRequest.AsyncGetResponse a WebClient.AsyncDownloadString.Oba prvky stažení dat z webové stránky, které dané adresy URL.AsyncGetResponsevytváří WebResponse objektu, a AsyncDownloadString vytvoří řetězec, který představuje HTML pro webové stránky.

Jsou součástí několika prvky pro asynchronní operací Microsoft.FSharp.Control.CommonExtensions modulu.Tyto metody rozšíření Stream třídy jsou Stream.AsyncRead a Stream.AsyncWrite.

Další asynchronní prvky jsou k dispozici v PowerPack F#.Můžete také napsat vlastní asynchronní primitiv definováním funkce subjekt, jehož dokončení je uzavřena v bloku asynchronní.

Asynchronní metody v.NET Framework jsou navrženy pro ostatní modely asynchronní F# asynchronní programovací model, vytvořte funkci, která vrací F# Async objektu.F# knihovna obsahuje funkce, které to snadné.

Příklad použití pracovních postupů asynchronní uvádíme; existuje mnoho ostatní dokumentace pro metody třídy asynchronní.

Příklad

Tento příklad ukazuje použití asynchronní pracovní postupy paralelně provádět výpočty.

V následujícím příkladu kódu funkce fetchAsync získá HTML text vrácených z webového požadavku.fetchAsync Funkce obsahuje asynchronní bloku kódu.Při vazbě k výsledek asynchronního základní, v tomto případě AsyncDownloadString, let! se používá místo let.

Pomocí funkce Async.RunSynchronously asynchronní operaci provést a čekat na jeho výsledek.Například, můžete spouštět více asynchronních operací současně pomocí Async.Parallel společně pracovat Async.RunSynchronously funkce.Async.Parallel Funkce přijímá seznam Async objekty, nastaví kód pro každou Async objekt úlohy v paralelní a vrací Async objekt představující paralelní výpočet.Pouze pro jedinou operaci při volání Async.RunSynchronously jeho spuštění.

runAll Funkce spustí tři pracovní postupy asynchronní paralelně a čeká, dokud všechny dokončené.

open System.Net
open Microsoft.FSharp.Control.WebExtensions

let urlList = [ "Microsoft.com", "https://www.microsoft.com/" 
                "MSDN", "https://msdn.microsoft.com/" 
                "Bing", "https://www.bing.com"
              ]

let fetchAsync(name, url:string) =
    async { 
        try 
            let uri = new System.Uri(url)
            let webClient = new WebClient()
            let! html = webClient.AsyncDownloadString(uri)
            printfn "Read %d characters for %s" html.Length name
        with
            | ex -> printfn "%s" (ex.Message);
    }

let runAll() =
    urlList
    |> Seq.map fetchAsync
    |> Async.Parallel 
    |> Async.RunSynchronously
    |> ignore

runAll()

Viz také

Referenční dokumentace

Control.Async – třída (F#)

Další zdroje

Referenční dokumentace jazyka F#

Výpočetní výrazy (F#)