Asynchrone bewerkingen

Gebruik liever asynchrone versies van bewerkingen in plaats van synchrone versies, voor zover mogelijk.

Synchrone bewerkingen worden uitgevoerd zodra de code dat aangeeft, en de code wacht tot deze bewerkingen zijn voltooid voordat er verder wordt gegaan. Dit betekent dus dat deze bewerkingen in de toepassingscodefase van de framelusbewerking worden uitgevoerd. Als een synchrone bewerking te lang duurt, wordt de framelusbewerking verlengd, wat er toe kan leiden dat de weergave hapert of lijkt vast te lopen.

Wanneer de code een asynchrone bewerking uitvoert, wordt deze niet altijd meteen uitgevoerd. De code en andere toepassingscode in de huidige uitvoeringsthread worden zonder onderbreking uitgevoerd. Zodra het mogelijk is wordt de bewerking uitgevoerd, en tegelijkertijd wordt ernaar gestreefd om renderingproblemen te voorkomen. Soms vindt de uitvoering op de achtergrond plaats en dus niet als deel van de framelusbewerking. Wanneer de bewerking is voltooid, wordt een gebeurtenis verzonden. Uw code kan naar aanleiding van die gebeurtenis een volgende taak uitvoeren.

Asynchrone bewerkingen worden gepland en gesplitst·om renderingproblemen te voorkomen. Hierdoor dragen asynchrone versies van bewerkingen·bij aan een snelle uitvoering van de toepassing zonder onderbrekingen. Zie Waargenomen prestaties versus werkelijke prestaties voor meer informatie.

Bij het uitvoeren van asynchrone bewerkingen is er echter wel sprake van overhead. De werkelijke uitvoeringstijd kan langer duren voor asynchrone bewerkingen, vooral bij bewerkingen die in korte tijd worden voltooid.

In de runtime zijn veel bewerkingen van zichzelf synchroon of asynchroon, en kunt u niet zelf kiezen op welke wijze ze worden uitgevoerd. In Adobe AIR kunt u echter kiezen uit drie soorten bewerkingen die naar wens synchroon of asynchroon kunnen worden uitgevoerd:

  • Bewerkingen van de klassen File en FileStream

    Een groot aantal bewerkingen van de klasse File kunnen synchroon of asynchroon worden uitgevoerd. De methoden voor het kopiëren of verwijderen van bestanden of directory's en het weergeven van de inhoud van directory's hebben allemaal een asynchrone versie. Bij deze methoden wordt het achtervoegsel 'Async' aan de naam van de asynchrone versie toegevoegd. Als u bijvoorbeeld een bestand asynchroon wilt verwijderen, roept u de methode File.deleteFileAsync() aan in plaats van de methode File.deleteFile() .

    Wanneer u een object FileStream gebruikt om te lezen van of te schrijven naar een bestand, bepaalt·de manier waarop het object FileStream wordt geopend of de bewerkingen asynchroon worden uitgevoerd. Gebruik de methode FileStream.openAsync() voor asynchrone bewerkingen. Het schrijven van gegevens wordt asynchroon uitgevoerd. Het lezen van gegevens wordt in delen uitgevoerd, waardoor de gegevens deel voor deel beschikbaar zijn. Met de synchrone methode van het object FileStream wordt het gehele bestand gelezen voordat de code verder wordt uitgevoerd.

  • Lokale SQL-databasebewerkingen

    Wanneer u met een lokale SQL-database werkt, worden alle bewerking via een object SQLConnection uitgevoerd in de synchrone of asynchrone modus. Als u wilt opgeven dat bewerkingen asynchroon moeten worden uitgevoerd, opent u de verbinding met de database via de methode SQLConnection.openAsync() in plaats van de methode SQLConnection.open() . Wanneer databasebewerkingen asynchroon worden uitgevoerd, vinden deze op de achtergrond plaats. De database-engine wordt helemaal niet in de lusbewerking uitgevoerd, waardoor de databasebewerkingen meestal geen renderingproblemen tot gevolg hebben.

    Raadpleeg Prestaties van SQL-databases voor meer informatie over het verbeteren van prestaties van de lokale SQL-database.

  • Zelfstandige Pixel Bender-arceringen

    Met de klasse ShaderJob kunt u een afbeelding of gegevensset uitvoeren via een Pixel Bender-arcering en hebt u toegang tot de ruwe resultaatgegevens. Wanneer de methode ShaderJob.start() wordt aangeroepen, wordt de arcering standaard asynchroon uitgevoerd. De uitvoering vindt plaats op de achtergrond, en maakt dus geen gebruik van de lusbewerking. Als u wilt afdwingen dat het object ShaderJob synchroon wordt uitgevoerd (dit wordt niet aanbevolen), geeft u de waarde true door aan de eerste parameter van de methode start() .

Naast deze ingebouwde mechanismen voor het asynchroon uitvoeren van code kunt u ook uw eigen code zo structureren dat deze asynchroon wordt uitgevoerd in plaats van synchroon. Als u code schrijft voor het uitvoeren van·een taak die mogelijk lang duurt, kunt u de code zo structureren dat deze in delen wordt uitgevoerd. Wanneer de code is opgedeeld, kan de rendering plaatsvinden tussen de uitvoering van de afzonderlijke blokken code door, waardoor er minder kans op renderingproblemen is.

Hieronder volgt een aantal technieken voor het splitsen·van code. Het algemene idee achter al deze technieken is dat de code zo wordt geschreven dat deze per keer slechts een deel van het werk uitvoert. U kunt bijhouden wat de code doet en wanneer deze stopt. U gebruikt een mechanisme, bijvoorbeeld een object Timer, om herhaaldelijk te controleren of er nog werk gedaan moet worden en om extra werk in delen uit te voeren, totdat al het werk is voltooid.

Er bestaan een paar patronen waarmee code zo gestructureerd wordt dat het werk wordt gesplitst. De volgende artikelen en codebibliotheken geven een beschrijving van deze patronen en bieden code waarmee u de patronen in uw toepassingen kunt implementeren: